Harbour LLVM Backend · v3.2.0dev

Harbour LLVM IR

An xBase compiler that emits LLVM IR directly and links a native executable in-process — no external C/C++ toolchain on PATH, no second-stage build.

All 26 programs validated and matched the C backend
9
Opcode groups
26
Corpus programs
26
Verified vs C
0
External deps

commit fffcdb1 · Harbour 3.2.0dev (r2605141250) · generated 2026-05-26 06:50 UTC

What it does, what you get

A fork of Harbour — the free, multi-platform Clipper/xBase compiler — with an LLVM backend that turns harbour into a frontend, the way clang is a frontend for Objective-C.

How it works

  • harbour -GL hello.prg parses the xBase source and emits LLVM IR text (.ll), not C.
  • The embedded libLLVM C API turns that IR into a native object; the embedded LLD linker links the executable — all in-process, no second pass.
  • Each pcode opcode in the supported subset becomes one hb_vmsh_* shim call: one basic block per opcode, no interpreter dispatch — straight-line native code.
  • Functions using opcodes outside the subset fall back, whole-function, to the hb_vmExecute interpreter — correctness is always preserved.

What you achieve

  • Zero external toolchain. No gcc / MSVC / clang on PATH. No second-stage make. One harbour.exe.
  • 100% Harbour-compatible. The shims call the same hb_vm* helpers the interpreter calls; every test diff-checks byte-for-byte against the C backend.
  • Nine opcode groups straight-lined — FOR loops, arrays, RDD/memvars, OOP, FOR EACH, SWITCH, codeblocks, macros, SEQUENCE (try/catch + try/finally).
  • Permanent fallback safety net. Programs that touch the (small) set of intentionally-unsupported opcodes still build and run correctly via the interpreter.
  • Open to future type specialization — removing dispatch overhead is the first half; specializing local int/double slots is the next bigger win.

Opcode coverage

All nine groups in the original decomposition complete. Each has its own spec + plan in docs/superpowers/.

GroupCovers
AFOR loops + compound assignment (+=, ++, --, …)done
BArrays + hashes: literals, element access, Array(), LOCAL a[m,n]done
CRDD fields, memvars, aliased access, workarea selectiondone
DOOP message sends, Self, WITH OBJECTdone
EFOR EACH loops (and DESCEND) over arrays, hashes, stringsdone
FSWITCH — lowered to a native LLVM switch instructiondone
GCodeblock literals {|args| ... }done
HMacros: &var, &("expr"), text…endtext, @&vardone
IBEGIN SEQUENCE…RECOVER…END (try/catch) and …ALWAYS…END (try/finally)done

Try it locally

From a clean clone to a running hello-world in four short steps. Linux/macOS and Windows (MinGW) both work.

1

Prerequisites

A standard C toolchain to build Harbour itself, plus an LLVM install for the test-suite verifier:

# Linux / macOS
sudo apt install build-essential clang     # or: brew install llvm

# Windows (MinGW-w64 from winlibs.com)
# Add gcc + win-make.exe to PATH; install LLVM for Windows
2

Clone and build

Builds the compiler with the LLVM backend embedded:

git clone https://github.com/FiveTechSoft/harbourllvm
cd harbourllvm/core

# Linux / macOS
make

# Windows (MinGW)
set HB_COMPILER=mingw64
win-make.exe
3

Hello world — compile and run

Save this as hello.prg:

function Main()
   local cName := "world"
   ? "hello, " + cName
   return nil

Compile it with the LLVM backend (note -GL) and run the resulting executable:

./bin/<platform>/harbour -GL hello.prg
./hello
# hello, world

Inspect the intermediate IR if you want — it sits next to the binary as hello.ll.

4

Run the corpus — diff against the C backend

The corpus compiles every tests/llvm/*.prg with both backends, runs the LLVM verifier on the emitted IR, links a native executable, and diffs its output against the standard C backend. Any difference fails the run.

CLANG=clang tests/llvm/run.sh
# -> writes build/llvm-ci/index.html
# -> exits non-zero on any difference

Open build/llvm-ci/index.html — it is a page just like this one, with every program’s source, generated IR, output, and pass/fail status. The GitHub Actions workflow runs this on every push and publishes the result to GitHub Pages.

Frequently asked questions

Common questions about how the LLVM backend works at run time. The full source-level answers are in the README FAQ.

Does harbour -GL produce a .exe directly?

Yes — in one command, in-process, no external C/C++ compiler or linker on PATH. The intermediate .ll and .o are kept next to the binary for inspection.

$ harbour -GL -ohello hello.prg
$ ls hello.*
hello.prg  hello.ll  hello.o  hello.exe   # source + IR + object + binary
$ ./hello
hello, world

Is the .exe a pre-built template that gets patched, or freshly compiled each time?

Freshly compiled and linked every time. Each invocation produces a unique binary (verifiable via sha1sum) — IR generated fresh from source, object compiled fresh, executable linked fresh. No "template + patch" shortcut. Two different programs produce different IRs of different sizes, different objects, different binaries with different SHA1s.

The ~1.3 MB common floor is the Harbour runtime statically linked in — the variable delta on top is the program's own native code.

Who actually does the linking?

harbour.exe itself, via embedded LLD. The src/llvmbe/ directory builds libhbllvm.a which contains:

  • libLLVM C API — turns the IR into a native object file.
  • LLD — the LLVM linker, wrapped by a tiny C++ shim (src/compiler/hb_lldshim.cpp) so C code can call lld::mingw::link in-process.

When harbour -GL runs, after emitting the .ll it calls into libhbllvm.a's emitObject then linkExe — no process fork, no external tool, no shell-out. libhbllvm.a is linked only into harbour.exe via a dispatch table (g_hb_llvm_backend), so hbmk2 and hbrun stay small.

How are libraries linked into the final executable?

harbour.exe builds a ld.lld-style argv in src/compiler/hb_llvmobj.c and hands it to LLD. The argv references three sets of libraries, all shipped with Harbour:

SetLocationContents
CRTlib/win/mingw64-rt/ crt2.o, crtbegin/end.o, libgcc.a, libmingwex.a, libmsvcrt.a, plus all Win32 import libs (kernel32, user32, ws2_32, …)
HRTlib/win/mingw64/ libhbvm.a, libhbrtl.a, libhbcommon.a, libhblang.a, libhbcpage.a, …
GTlib/win/mingw64-rt/ hb_llvmgtstd.o — pre-compiled gtstd GT driver registration (forced via --undefined HB_FUN_HB_GT_STD_DEFAULT)

Plus this program's own freshly-compiled .o. The end-user's machine needs no toolchain at all — Harbour ships its own C runtime, MinGW import libs, the Harbour runtime, and the LLVM/LLD code generator inside harbour.exe. One install, one binary, runnable executables out.

Continuous verification

Below is the latest run. Every card is one tests/llvm/*.prg program — xBase source on the left, full generated LLVM IR on the right, output and diff at the bottom. Click download .ll to grab the IR.

aparams.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local a := { 10, 20, 30 }
   ? Sum3( HB_ARRAYTOPARAMS( a ) )
   return nil

function Sum3( x, y, z )
   return x + y + z

LLVM IR (302 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/aparams.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_APARAMS = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [40 x i8] c"\0D\01\00\24\02\00\5C\0A\5C\14\5C\1E\04\03\00\50\01\24\03\00\B0\02\00\B0\03\00\5F\01\B4\7B\01\00\14\01\24\04\00\64\6E\07"
@.pcode.HB_FUN_SUM3 = internal constant [16 x i8] c"\0D\00\03\24\07\00\5F\01\5F\02\48\5F\03\48\6E\07"

@.sym.0 = private constant [8 x i8] c"\41\50\41\52\41\4D\53\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"
@.sym.3 = private constant [5 x i8] c"\53\55\4D\33\00"

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

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_APARAMS 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 },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.3, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_SUM3 to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 10)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_pushint(i32 20)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushint(i32 30)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_arraygen(i32 3)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %ipfs20a
ipfs20a:
  %r20b = call i32 @hb_vmsh_pushnil()
  %c20b = icmp ne i32 %r20b, 0
  br i1 %c20b, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %ipfs23a
ipfs23a:
  %r23b = call i32 @hb_vmsh_pushnil()
  %c23b = icmp ne i32 %r23b, 0
  br i1 %c23b, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_pushaparams()
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_macrofunc(i32 1)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_do(i32 1)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  br label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushnil()
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_retvalue()
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i39
i39:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_SUM3() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 3)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_plus()
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_plus()
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_retvalue()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([23 x i8], [23 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"

Program output

        60

arith.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local a := 7, b := 5
   ? a + b, a - b, a * b, a / b
   ? -a, ( a + b ) * 2
   return nil

LLVM IR (323 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/arith.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_ARITH = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [67 x i8] c"\0D\02\00\24\02\00\5C\07\50\01\5C\05\50\02\24\03\00\B0\02\00\5F\01\5F\02\48\5F\01\5F\02\31\5F\01\5F\02\41\5F\01\5F\02\12\14\04\24\04\00\B0\02\00\5F\01\42\5F\01\5F\02\48\5C\02\41\14\02\24\05\00\64\6E\07"

@.sym.0 = private constant [6 x i8] c"\41\52\49\54\48\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\61\72\69\74\68\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_ARITH 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 }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 7)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_poplocal(i32 1)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushint(i32 5)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_poplocal(i32 2)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  br label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %ipfs17a
ipfs17a:
  %r17b = call i32 @hb_vmsh_pushnil()
  %c17b = icmp ne i32 %r17b, 0
  br i1 %c17b, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_plus()
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_minus()
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_mult()
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_divide()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_do(i32 4)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %ipfs45a
ipfs45a:
  %r45b = call i32 @hb_vmsh_pushnil()
  %c45b = icmp ne i32 %r45b, 0
  br i1 %c45b, label %epilogue, label %i48
i48:
  %r48 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_negate()
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_plus()
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_pushint(i32 2)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_mult()
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_do(i32 2)
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i61
i61:
  br label %i64
i64:
  %r64 = call i32 @hb_vmsh_pushnil()
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i65
i65:
  %r65 = call i32 @hb_vmsh_retvalue()
  %c65 = icmp ne i32 %r65, 0
  br i1 %c65, label %epilogue, label %i66
i66:
  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"

Program output

        12          2         35          1.40
        -7         24

arraydim.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local a := Array( 3, 2 )
   a[ 1 ][ 1 ] := 11
   a[ 1 ][ 2 ] := 12
   a[ 2 ][ 1 ] := 21
   a[ 2 ][ 2 ] := 22
   a[ 3 ][ 1 ] := 31
   a[ 3 ][ 2 ] := 32
   ? a[ 1 ][ 1 ], a[ 1 ][ 2 ]
   ? a[ 2 ][ 1 ], a[ 2 ][ 2 ]
   ? a[ 3 ][ 1 ], a[ 3 ][ 2 ]
   return nil

LLVM IR (551 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/arraydim.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_ARRAY()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_ARRAYDIM = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [163 x i8] c"\0D\01\00\24\02\00\B0\02\00\5C\03\5C\02\0C\02\50\01\24\03\00\5C\0B\5F\01\7A\01\7A\02\24\04\00\5C\0C\5F\01\7A\01\5C\02\02\24\05\00\5C\15\5F\01\5C\02\01\7A\02\24\06\00\5C\16\5F\01\5C\02\01\5C\02\02\24\07\00\5C\1F\5F\01\5C\03\01\7A\02\24\08\00\5C\20\5F\01\5C\03\01\5C\02\02\24\09\00\B0\03\00\5F\01\7A\01\7A\01\5F\01\7A\01\5C\02\01\14\02\24\0A\00\B0\03\00\5F\01\5C\02\01\7A\01\5F\01\5C\02\01\5C\02\01\14\02\24\0B\00\B0\03\00\5F\01\5C\03\01\7A\01\5F\01\5C\03\01\5C\02\01\14\02\24\0C\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\41\52\52\41\59\44\49\4D\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [6 x i8] c"\41\52\52\41\59\00"
@.sym.3 = private constant [5 x i8] c"\51\4F\55\54\00"

@.modname = private constant [24 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\61\72\72\61\79\64\69\6D\2E\70\72\67\00"

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_ARRAYDIM 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([6 x i8], [6 x i8]* @.sym.2, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_ARRAY to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %ipfs6a
ipfs6a:
  %r6b = call i32 @hb_vmsh_pushnil()
  %c6b = icmp ne i32 %r6b, 0
  br i1 %c6b, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushint(i32 3)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_pushint(i32 2)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_function(i32 2)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushint(i32 11)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushint(i32 1)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_arraypush()
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_pushint(i32 1)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_arraypop()
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i28
i28:
  br label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushint(i32 12)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushint(i32 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_arraypush()
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushint(i32 2)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_arraypop()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  br label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushint(i32 21)
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_pushint(i32 2)
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i49
i49:
  %r49 = call i32 @hb_vmsh_arraypush()
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_pushint(i32 1)
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  %r51 = call i32 @hb_vmsh_arraypop()
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i52
i52:
  br label %i55
i55:
  %r55 = call i32 @hb_vmsh_pushint(i32 22)
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i57
i57:
  %r57 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_pushint(i32 2)
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i61
i61:
  %r61 = call i32 @hb_vmsh_arraypush()
  %c61 = icmp ne i32 %r61, 0
  br i1 %c61, label %epilogue, label %i62
i62:
  %r62 = call i32 @hb_vmsh_pushint(i32 2)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i64
i64:
  %r64 = call i32 @hb_vmsh_arraypop()
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i65
i65:
  br label %i68
i68:
  %r68 = call i32 @hb_vmsh_pushint(i32 31)
  %c68 = icmp ne i32 %r68, 0
  br i1 %c68, label %epilogue, label %i70
i70:
  %r70 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i72
i72:
  %r72 = call i32 @hb_vmsh_pushint(i32 3)
  %c72 = icmp ne i32 %r72, 0
  br i1 %c72, label %epilogue, label %i74
i74:
  %r74 = call i32 @hb_vmsh_arraypush()
  %c74 = icmp ne i32 %r74, 0
  br i1 %c74, label %epilogue, label %i75
i75:
  %r75 = call i32 @hb_vmsh_pushint(i32 1)
  %c75 = icmp ne i32 %r75, 0
  br i1 %c75, label %epilogue, label %i76
i76:
  %r76 = call i32 @hb_vmsh_arraypop()
  %c76 = icmp ne i32 %r76, 0
  br i1 %c76, label %epilogue, label %i77
i77:
  br label %i80
i80:
  %r80 = call i32 @hb_vmsh_pushint(i32 32)
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i82
i82:
  %r82 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %epilogue, label %i84
i84:
  %r84 = call i32 @hb_vmsh_pushint(i32 3)
  %c84 = icmp ne i32 %r84, 0
  br i1 %c84, label %epilogue, label %i86
i86:
  %r86 = call i32 @hb_vmsh_arraypush()
  %c86 = icmp ne i32 %r86, 0
  br i1 %c86, label %epilogue, label %i87
i87:
  %r87 = call i32 @hb_vmsh_pushint(i32 2)
  %c87 = icmp ne i32 %r87, 0
  br i1 %c87, label %epilogue, label %i89
i89:
  %r89 = call i32 @hb_vmsh_arraypop()
  %c89 = icmp ne i32 %r89, 0
  br i1 %c89, label %epilogue, label %i90
i90:
  br label %i93
i93:
  %r93 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c93 = icmp ne i32 %r93, 0
  br i1 %c93, label %epilogue, label %ipfs93a
ipfs93a:
  %r93b = call i32 @hb_vmsh_pushnil()
  %c93b = icmp ne i32 %r93b, 0
  br i1 %c93b, label %epilogue, label %i96
i96:
  %r96 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c96 = icmp ne i32 %r96, 0
  br i1 %c96, label %epilogue, label %i98
i98:
  %r98 = call i32 @hb_vmsh_pushint(i32 1)
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i99
i99:
  %r99 = call i32 @hb_vmsh_arraypush()
  %c99 = icmp ne i32 %r99, 0
  br i1 %c99, label %epilogue, label %i100
i100:
  %r100 = call i32 @hb_vmsh_pushint(i32 1)
  %c100 = icmp ne i32 %r100, 0
  br i1 %c100, label %epilogue, label %i101
i101:
  %r101 = call i32 @hb_vmsh_arraypush()
  %c101 = icmp ne i32 %r101, 0
  br i1 %c101, label %epilogue, label %i102
i102:
  %r102 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c102 = icmp ne i32 %r102, 0
  br i1 %c102, label %epilogue, label %i104
i104:
  %r104 = call i32 @hb_vmsh_pushint(i32 1)
  %c104 = icmp ne i32 %r104, 0
  br i1 %c104, label %epilogue, label %i105
i105:
  %r105 = call i32 @hb_vmsh_arraypush()
  %c105 = icmp ne i32 %r105, 0
  br i1 %c105, label %epilogue, label %i106
i106:
  %r106 = call i32 @hb_vmsh_pushint(i32 2)
  %c106 = icmp ne i32 %r106, 0
  br i1 %c106, label %epilogue, label %i108
i108:
  %r108 = call i32 @hb_vmsh_arraypush()
  %c108 = icmp ne i32 %r108, 0
  br i1 %c108, label %epilogue, label %i109
i109:
  %r109 = call i32 @hb_vmsh_do(i32 2)
  %c109 = icmp ne i32 %r109, 0
  br i1 %c109, label %epilogue, label %i111
i111:
  br label %i114
i114:
  %r114 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c114 = icmp ne i32 %r114, 0
  br i1 %c114, label %epilogue, label %ipfs114a
ipfs114a:
  %r114b = call i32 @hb_vmsh_pushnil()
  %c114b = icmp ne i32 %r114b, 0
  br i1 %c114b, label %epilogue, label %i117
i117:
  %r117 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c117 = icmp ne i32 %r117, 0
  br i1 %c117, label %epilogue, label %i119
i119:
  %r119 = call i32 @hb_vmsh_pushint(i32 2)
  %c119 = icmp ne i32 %r119, 0
  br i1 %c119, label %epilogue, label %i121
i121:
  %r121 = call i32 @hb_vmsh_arraypush()
  %c121 = icmp ne i32 %r121, 0
  br i1 %c121, label %epilogue, label %i122
i122:
  %r122 = call i32 @hb_vmsh_pushint(i32 1)
  %c122 = icmp ne i32 %r122, 0
  br i1 %c122, label %epilogue, label %i123
i123:
  %r123 = call i32 @hb_vmsh_arraypush()
  %c123 = icmp ne i32 %r123, 0
  br i1 %c123, label %epilogue, label %i124
i124:
  %r124 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c124 = icmp ne i32 %r124, 0
  br i1 %c124, label %epilogue, label %i126
i126:
  %r126 = call i32 @hb_vmsh_pushint(i32 2)
  %c126 = icmp ne i32 %r126, 0
  br i1 %c126, label %epilogue, label %i128
i128:
  %r128 = call i32 @hb_vmsh_arraypush()
  %c128 = icmp ne i32 %r128, 0
  br i1 %c128, label %epilogue, label %i129
i129:
  %r129 = call i32 @hb_vmsh_pushint(i32 2)
  %c129 = icmp ne i32 %r129, 0
  br i1 %c129, label %epilogue, label %i131
i131:
  %r131 = call i32 @hb_vmsh_arraypush()
  %c131 = icmp ne i32 %r131, 0
  br i1 %c131, label %epilogue, label %i132
i132:
  %r132 = call i32 @hb_vmsh_do(i32 2)
  %c132 = icmp ne i32 %r132, 0
  br i1 %c132, label %epilogue, label %i134
i134:
  br label %i137
i137:
  %r137 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c137 = icmp ne i32 %r137, 0
  br i1 %c137, label %epilogue, label %ipfs137a
ipfs137a:
  %r137b = call i32 @hb_vmsh_pushnil()
  %c137b = icmp ne i32 %r137b, 0
  br i1 %c137b, label %epilogue, label %i140
i140:
  %r140 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c140 = icmp ne i32 %r140, 0
  br i1 %c140, label %epilogue, label %i142
i142:
  %r142 = call i32 @hb_vmsh_pushint(i32 3)
  %c142 = icmp ne i32 %r142, 0
  br i1 %c142, label %epilogue, label %i144
i144:
  %r144 = call i32 @hb_vmsh_arraypush()
  %c144 = icmp ne i32 %r144, 0
  br i1 %c144, label %epilogue, label %i145
i145:
  %r145 = call i32 @hb_vmsh_pushint(i32 1)
  %c145 = icmp ne i32 %r145, 0
  br i1 %c145, label %epilogue, label %i146
i146:
  %r146 = call i32 @hb_vmsh_arraypush()
  %c146 = icmp ne i32 %r146, 0
  br i1 %c146, label %epilogue, label %i147
i147:
  %r147 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c147 = icmp ne i32 %r147, 0
  br i1 %c147, label %epilogue, label %i149
i149:
  %r149 = call i32 @hb_vmsh_pushint(i32 3)
  %c149 = icmp ne i32 %r149, 0
  br i1 %c149, label %epilogue, label %i151
i151:
  %r151 = call i32 @hb_vmsh_arraypush()
  %c151 = icmp ne i32 %r151, 0
  br i1 %c151, label %epilogue, label %i152
i152:
  %r152 = call i32 @hb_vmsh_pushint(i32 2)
  %c152 = icmp ne i32 %r152, 0
  br i1 %c152, label %epilogue, label %i154
i154:
  %r154 = call i32 @hb_vmsh_arraypush()
  %c154 = icmp ne i32 %r154, 0
  br i1 %c154, label %epilogue, label %i155
i155:
  %r155 = call i32 @hb_vmsh_do(i32 2)
  %c155 = icmp ne i32 %r155, 0
  br i1 %c155, label %epilogue, label %i157
i157:
  br label %i160
i160:
  %r160 = call i32 @hb_vmsh_pushnil()
  %c160 = icmp ne i32 %r160, 0
  br i1 %c160, label %epilogue, label %i161
i161:
  %r161 = call i32 @hb_vmsh_retvalue()
  %c161 = icmp ne i32 %r161, 0
  br i1 %c161, label %epilogue, label %i162
i162:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([24 x i8], [24 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"

Program output

        11         12
        21         22
        31         32

arraylit.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local a := { 10, 20, 30 }
   ? a[ 1 ], a[ 2 ], a[ 3 ]
   ? Len( a )
   return nil

LLVM IR (309 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/arraylit.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()
declare void @HB_FUN_LEN()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_ARRAYLIT = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [60 x i8] c"\0D\01\00\24\02\00\5C\0A\5C\14\5C\1E\04\03\00\50\01\24\03\00\B0\02\00\5F\01\7A\01\5F\01\5C\02\01\5F\01\5C\03\01\14\03\24\04\00\B0\02\00\B0\03\00\5F\01\0C\01\14\01\24\05\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\41\52\52\41\59\4C\49\54\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"
@.sym.3 = private constant [4 x i8] c"\4C\45\4E\00"

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

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_ARRAYLIT 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 },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_LEN to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 10)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_pushint(i32 20)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushint(i32 30)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_arraygen(i32 3)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %ipfs20a
ipfs20a:
  %r20b = call i32 @hb_vmsh_pushnil()
  %c20b = icmp ne i32 %r20b, 0
  br i1 %c20b, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_pushint(i32 1)
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_arraypush()
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushint(i32 2)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_arraypush()
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_pushint(i32 3)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_arraypush()
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_do(i32 3)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  br label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %ipfs42a
ipfs42a:
  %r42b = call i32 @hb_vmsh_pushnil()
  %c42b = icmp ne i32 %r42b, 0
  br i1 %c42b, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %ipfs45a
ipfs45a:
  %r45b = call i32 @hb_vmsh_pushnil()
  %c45b = icmp ne i32 %r45b, 0
  br i1 %c45b, label %epilogue, label %i48
i48:
  %r48 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_function(i32 1)
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i52
i52:
  %r52 = call i32 @hb_vmsh_do(i32 1)
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i54
i54:
  br label %i57
i57:
  %r57 = call i32 @hb_vmsh_pushnil()
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_retvalue()
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i59
i59:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([24 x i8], [24 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"

Program output

        10         20         30
         3

arraymdim.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local a[ 3, 4 ]
   a[ 1, 1 ] := 11
   a[ 3, 4 ] := 34
   ? a[ 1, 1 ], a[ 3, 4 ]
   ? Len( a ), Len( a[ 1 ] )
   return nil

LLVM IR (385 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/arraymdim.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()
declare void @HB_FUN_LEN()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_ARRAYMDIM = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [91 x i8] c"\0D\01\00\24\02\00\5C\03\5C\04\03\02\00\50\01\24\03\00\5C\0B\5F\01\7A\01\7A\02\24\04\00\5C\22\5F\01\5C\03\01\5C\04\02\24\05\00\B0\02\00\5F\01\7A\01\7A\01\5F\01\5C\03\01\5C\04\01\14\02\24\06\00\B0\02\00\B0\03\00\5F\01\0C\01\B0\03\00\5F\01\7A\01\0C\01\14\02\24\07\00\64\6E\07"

@.sym.0 = private constant [10 x i8] c"\41\52\52\41\59\4D\44\49\4D\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"
@.sym.3 = private constant [4 x i8] c"\4C\45\4E\00"

@.modname = private constant [25 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\61\72\72\61\79\6D\64\69\6D\2E\70\72\67\00"

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_ARRAYMDIM 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 },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_LEN to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 3)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_pushint(i32 4)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_arraydim(i32 2)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_poplocal(i32 1)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i15
i15:
  br label %i18
i18:
  %r18 = call i32 @hb_vmsh_pushint(i32 11)
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushint(i32 1)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_arraypush()
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushint(i32 1)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_arraypop()
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i26
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushint(i32 34)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_pushint(i32 3)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_arraypush()
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_pushint(i32 4)
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_arraypop()
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i39
i39:
  br label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %ipfs42a
ipfs42a:
  %r42b = call i32 @hb_vmsh_pushnil()
  %c42b = icmp ne i32 %r42b, 0
  br i1 %c42b, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_pushint(i32 1)
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i48
i48:
  %r48 = call i32 @hb_vmsh_arraypush()
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i49
i49:
  %r49 = call i32 @hb_vmsh_pushint(i32 1)
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_arraypush()
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushint(i32 3)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_arraypush()
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_pushint(i32 4)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_arraypush()
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_do(i32 2)
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i61
i61:
  br label %i64
i64:
  %r64 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %ipfs64a
ipfs64a:
  %r64b = call i32 @hb_vmsh_pushnil()
  %c64b = icmp ne i32 %r64b, 0
  br i1 %c64b, label %epilogue, label %i67
i67:
  %r67 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c67 = icmp ne i32 %r67, 0
  br i1 %c67, label %epilogue, label %ipfs67a
ipfs67a:
  %r67b = call i32 @hb_vmsh_pushnil()
  %c67b = icmp ne i32 %r67b, 0
  br i1 %c67b, label %epilogue, label %i70
i70:
  %r70 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i72
i72:
  %r72 = call i32 @hb_vmsh_function(i32 1)
  %c72 = icmp ne i32 %r72, 0
  br i1 %c72, label %epilogue, label %i74
i74:
  %r74 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c74 = icmp ne i32 %r74, 0
  br i1 %c74, label %epilogue, label %ipfs74a
ipfs74a:
  %r74b = call i32 @hb_vmsh_pushnil()
  %c74b = icmp ne i32 %r74b, 0
  br i1 %c74b, label %epilogue, label %i77
i77:
  %r77 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c77 = icmp ne i32 %r77, 0
  br i1 %c77, label %epilogue, label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushint(i32 1)
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %i80
i80:
  %r80 = call i32 @hb_vmsh_arraypush()
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i81
i81:
  %r81 = call i32 @hb_vmsh_function(i32 1)
  %c81 = icmp ne i32 %r81, 0
  br i1 %c81, label %epilogue, label %i83
i83:
  %r83 = call i32 @hb_vmsh_do(i32 2)
  %c83 = icmp ne i32 %r83, 0
  br i1 %c83, label %epilogue, label %i85
i85:
  br label %i88
i88:
  %r88 = call i32 @hb_vmsh_pushnil()
  %c88 = icmp ne i32 %r88, 0
  br i1 %c88, label %epilogue, label %i89
i89:
  %r89 = call i32 @hb_vmsh_retvalue()
  %c89 = icmp ne i32 %r89, 0
  br i1 %c89, label %epilogue, label %i90
i90:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([25 x i8], [25 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"

Program output

        11         34
         3          4

arrayref.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local a := { 1, 2, 3 }
   Bump( @a[ 2 ] )
   ? a[ 2 ]
   return nil

function Bump( x )
   x := x + 100
   return nil

LLVM IR (310 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/arrayref.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_ARRAYREF = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [48 x i8] c"\0D\01\00\24\02\00\7A\5C\02\5C\03\04\03\00\50\01\24\03\00\B0\02\00\5F\01\5C\02\94\14\01\24\04\00\B0\03\00\5F\01\5C\02\01\14\01\24\05\00\64\6E\07"
@.pcode.HB_FUN_BUMP = internal constant [16 x i8] c"\0D\00\01\24\08\00\7E\01\64\00\24\09\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\41\52\52\41\59\52\45\46\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [5 x i8] c"\42\55\4D\50\00"
@.sym.3 = private constant [5 x i8] c"\51\4F\55\54\00"

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

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_ARRAYREF 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 513,
           i8* bitcast(void()* @HB_FUN_BUMP to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_pushint(i32 2)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushint(i32 3)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_arraygen(i32 3)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 1)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %ipfs19a
ipfs19a:
  %r19b = call i32 @hb_vmsh_pushnil()
  %c19b = icmp ne i32 %r19b, 0
  br i1 %c19b, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushint(i32 2)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_arraypushref()
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_do(i32 1)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i29
i29:
  br label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %ipfs32a
ipfs32a:
  %r32b = call i32 @hb_vmsh_pushnil()
  %c32b = icmp ne i32 %r32b, 0
  br i1 %c32b, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushint(i32 2)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_arraypush()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_do(i32 1)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushnil()
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_retvalue()
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i47
i47:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_BUMP() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_localnearaddint(i32 1, i32 100)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i10
i10:
  br label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushnil()
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_retvalue()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([24 x i8], [24 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"

Program output

       102

calls.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   ? Twice( 21 )
   return nil

function Twice( n )
   return n * 2

LLVM IR (264 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/calls.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_CALLS = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [21 x i8] c"\24\02\00\B0\02\00\B0\03\00\5C\15\0C\01\14\01\24\03\00\64\6E\07"
@.pcode.HB_FUN_TWICE = internal constant [13 x i8] c"\0D\00\01\24\06\00\5F\01\5C\02\41\6E\07"

@.sym.0 = private constant [6 x i8] c"\43\41\4C\4C\53\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"
@.sym.3 = private constant [6 x i8] c"\54\57\49\43\45\00"

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

@symbols_table = internal global [4 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_CALLS 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 },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.3, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TWICE to i8*),
           i8* null }
]


define void @HB_FUN_CALLS() {
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([4 x %HB_SYMB], [4 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_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %ipfs6a
ipfs6a:
  %r6b = call i32 @hb_vmsh_pushnil()
  %c6b = icmp ne i32 %r6b, 0
  br i1 %c6b, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushint(i32 21)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_function(i32 1)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_do(i32 1)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i15
i15:
  br label %i18
i18:
  %r18 = call i32 @hb_vmsh_pushnil()
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_retvalue()
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i20
i20:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TWICE() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_pushint(i32 2)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_mult()
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_retvalue()
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i12
i12:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    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"

Program output

        42

codeblock.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

//
// Group G corpus — codeblocks straight-lined by the LLVM backend.
//
// Exercises the compatibility-critical cases: parameterless block,
// parameterised block via Eval(), block capturing an enclosing local
// (detached local), nested codeblocks, and a block stored then evaluated.
//
function Main()
   local bAdd    := {| x, y | x + y }
   local nBase   := 100
   local bCapture := {| x | x + nBase }
   local bNested := {| x | Eval( {| y | y * 2 }, x ) + 1 }
   local bStored

   ? Eval( {|| "no args" } )
   ? Eval( bAdd, 3, 4 )
   ? Eval( bCapture, 5 )
   ? Eval( bNested, 10 )

   bStored := {| x | x - 1 }
   ? Eval( bStored, 42 )
   return nil

LLVM IR (401 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/codeblock.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_CODEBLOCK = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [202 x i8] c"\0D\05\00\24\09\00\59\0D\00\02\00\00\00\5F\01\5F\02\48\06\50\01\24\0A\00\5C\64\50\02\24\0B\00\59\0F\00\01\00\01\00\02\00\5F\01\5F\FF\48\06\50\03\24\0C\00\59\1E\00\01\00\00\00\30\02\00\59\0D\00\01\00\00\00\5F\01\5C\02\41\06\5F\01\70\01\7A\48\06\50\04\24\0F\00\B0\03\00\30\02\00\5A\0D\6A\08\6E\6F\20\61\72\67\73\00\06\70\00\14\01\24\10\00\B0\03\00\30\02\00\5F\01\5C\03\5C\04\70\02\14\01\24\11\00\B0\03\00\30\02\00\5F\03\5C\05\70\01\14\01\24\12\00\B0\03\00\30\02\00\5F\04\5C\0A\70\01\14\01\24\14\00\59\0C\00\01\00\00\00\5F\01\7A\31\06\50\05\24\15\00\B0\03\00\30\02\00\5F\05\5C\2A\70\01\14\01\24\16\00\64\6E\07"

@.sym.0 = private constant [10 x i8] c"\43\4F\44\45\42\4C\4F\43\4B\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [5 x i8] c"\45\56\41\4C\00"
@.sym.3 = private constant [5 x i8] c"\51\4F\55\54\00"

@.modname = private constant [25 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\63\6F\64\65\62\6C\6F\63\6B\2E\70\72\67\00"

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_CODEBLOCK 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 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 5, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushblock(i8* getelementptr([202 x i8], [202 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 6), %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0))
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_poplocal(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  br label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushint(i32 100)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_poplocal(i32 2)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i28
i28:
  br label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushblock(i8* getelementptr([202 x i8], [202 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 31), %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0))
  br label %i46
i46:
  %r46 = call i32 @hb_vmsh_poplocal(i32 3)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushblock(i8* getelementptr([202 x i8], [202 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 51), %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0))
  br label %i81
i81:
  %r81 = call i32 @hb_vmsh_poplocal(i32 4)
  %c81 = icmp ne i32 %r81, 0
  br i1 %c81, label %epilogue, label %i83
i83:
  br label %i86
i86:
  %r86 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c86 = icmp ne i32 %r86, 0
  br i1 %c86, label %epilogue, label %ipfs86a
ipfs86a:
  %r86b = call i32 @hb_vmsh_pushnil()
  %c86b = icmp ne i32 %r86b, 0
  br i1 %c86b, label %epilogue, label %i89
i89:
  %r89 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c89 = icmp ne i32 %r89, 0
  br i1 %c89, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_pushblock(i8* getelementptr([202 x i8], [202 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 92), %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0))
  br label %i105
i105:
  %r105 = call i32 @hb_vmsh_send(i32 0)
  %c105 = icmp ne i32 %r105, 0
  br i1 %c105, label %epilogue, label %i107
i107:
  %r107 = call i32 @hb_vmsh_do(i32 1)
  %c107 = icmp ne i32 %r107, 0
  br i1 %c107, label %epilogue, label %i109
i109:
  br label %i112
i112:
  %r112 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c112 = icmp ne i32 %r112, 0
  br i1 %c112, label %epilogue, label %ipfs112a
ipfs112a:
  %r112b = call i32 @hb_vmsh_pushnil()
  %c112b = icmp ne i32 %r112b, 0
  br i1 %c112b, label %epilogue, label %i115
i115:
  %r115 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c115 = icmp ne i32 %r115, 0
  br i1 %c115, label %epilogue, label %i118
i118:
  %r118 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c118 = icmp ne i32 %r118, 0
  br i1 %c118, label %epilogue, label %i120
i120:
  %r120 = call i32 @hb_vmsh_pushint(i32 3)
  %c120 = icmp ne i32 %r120, 0
  br i1 %c120, label %epilogue, label %i122
i122:
  %r122 = call i32 @hb_vmsh_pushint(i32 4)
  %c122 = icmp ne i32 %r122, 0
  br i1 %c122, label %epilogue, label %i124
i124:
  %r124 = call i32 @hb_vmsh_send(i32 2)
  %c124 = icmp ne i32 %r124, 0
  br i1 %c124, label %epilogue, label %i126
i126:
  %r126 = call i32 @hb_vmsh_do(i32 1)
  %c126 = icmp ne i32 %r126, 0
  br i1 %c126, label %epilogue, label %i128
i128:
  br label %i131
i131:
  %r131 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c131 = icmp ne i32 %r131, 0
  br i1 %c131, label %epilogue, label %ipfs131a
ipfs131a:
  %r131b = call i32 @hb_vmsh_pushnil()
  %c131b = icmp ne i32 %r131b, 0
  br i1 %c131b, label %epilogue, label %i134
i134:
  %r134 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c134 = icmp ne i32 %r134, 0
  br i1 %c134, label %epilogue, label %i137
i137:
  %r137 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c137 = icmp ne i32 %r137, 0
  br i1 %c137, label %epilogue, label %i139
i139:
  %r139 = call i32 @hb_vmsh_pushint(i32 5)
  %c139 = icmp ne i32 %r139, 0
  br i1 %c139, label %epilogue, label %i141
i141:
  %r141 = call i32 @hb_vmsh_send(i32 1)
  %c141 = icmp ne i32 %r141, 0
  br i1 %c141, label %epilogue, label %i143
i143:
  %r143 = call i32 @hb_vmsh_do(i32 1)
  %c143 = icmp ne i32 %r143, 0
  br i1 %c143, label %epilogue, label %i145
i145:
  br label %i148
i148:
  %r148 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c148 = icmp ne i32 %r148, 0
  br i1 %c148, label %epilogue, label %ipfs148a
ipfs148a:
  %r148b = call i32 @hb_vmsh_pushnil()
  %c148b = icmp ne i32 %r148b, 0
  br i1 %c148b, label %epilogue, label %i151
i151:
  %r151 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c151 = icmp ne i32 %r151, 0
  br i1 %c151, label %epilogue, label %i154
i154:
  %r154 = call i32 @hb_vmsh_pushlocal(i32 4)
  %c154 = icmp ne i32 %r154, 0
  br i1 %c154, label %epilogue, label %i156
i156:
  %r156 = call i32 @hb_vmsh_pushint(i32 10)
  %c156 = icmp ne i32 %r156, 0
  br i1 %c156, label %epilogue, label %i158
i158:
  %r158 = call i32 @hb_vmsh_send(i32 1)
  %c158 = icmp ne i32 %r158, 0
  br i1 %c158, label %epilogue, label %i160
i160:
  %r160 = call i32 @hb_vmsh_do(i32 1)
  %c160 = icmp ne i32 %r160, 0
  br i1 %c160, label %epilogue, label %i162
i162:
  br label %i165
i165:
  %r165 = call i32 @hb_vmsh_pushblock(i8* getelementptr([202 x i8], [202 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 165), %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0))
  br label %i177
i177:
  %r177 = call i32 @hb_vmsh_poplocal(i32 5)
  %c177 = icmp ne i32 %r177, 0
  br i1 %c177, label %epilogue, label %i179
i179:
  br label %i182
i182:
  %r182 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c182 = icmp ne i32 %r182, 0
  br i1 %c182, label %epilogue, label %ipfs182a
ipfs182a:
  %r182b = call i32 @hb_vmsh_pushnil()
  %c182b = icmp ne i32 %r182b, 0
  br i1 %c182b, label %epilogue, label %i185
i185:
  %r185 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c185 = icmp ne i32 %r185, 0
  br i1 %c185, label %epilogue, label %i188
i188:
  %r188 = call i32 @hb_vmsh_pushlocal(i32 5)
  %c188 = icmp ne i32 %r188, 0
  br i1 %c188, label %epilogue, label %i190
i190:
  %r190 = call i32 @hb_vmsh_pushint(i32 42)
  %c190 = icmp ne i32 %r190, 0
  br i1 %c190, label %epilogue, label %i192
i192:
  %r192 = call i32 @hb_vmsh_send(i32 1)
  %c192 = icmp ne i32 %r192, 0
  br i1 %c192, label %epilogue, label %i194
i194:
  %r194 = call i32 @hb_vmsh_do(i32 1)
  %c194 = icmp ne i32 %r194, 0
  br i1 %c194, label %epilogue, label %i196
i196:
  br label %i199
i199:
  %r199 = call i32 @hb_vmsh_pushnil()
  %c199 = icmp ne i32 %r199, 0
  br i1 %c199, label %epilogue, label %i200
i200:
  %r200 = call i32 @hb_vmsh_retvalue()
  %c200 = icmp ne i32 %r200, 0
  br i1 %c200, label %epilogue, label %i201
i201:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([25 x i8], [25 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"

Program output

no args
         7
       105
        21
        41

compound.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local n := 10
   n += 5
   n -= 3
   n *= 2
   n /= 4
   n++
   n--
   ? n
   return nil

LLVM IR (281 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/compound.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_COMPOUND = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [70 x i8] c"\0D\01\00\24\02\00\5C\0A\50\01\24\03\00\7E\01\05\00\24\04\00\7E\01\FD\FF\24\05\00\60\01\00\5C\02\89\24\06\00\60\01\00\5C\04\8A\24\07\00\AE\01\00\24\08\00\AD\01\00\24\09\00\B0\02\00\5F\01\14\01\24\0A\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\43\4F\4D\50\4F\55\4E\44\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 [24 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\63\6F\6D\70\6F\75\6E\64\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_COMPOUND 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 }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 10)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_poplocal(i32 1)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  br label %i13
i13:
  %r13 = call i32 @hb_vmsh_localnearaddint(i32 1, i32 5)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_localnearaddint(i32 1, i32 -3)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i24
i24:
  br label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushint(i32 2)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_multeqpop()
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i33
i33:
  br label %i36
i36:
  %r36 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushint(i32 4)
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i41
i41:
  %r41 = call i32 @hb_vmsh_diveqpop()
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %epilogue, label %i42
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_localinc(i32 1)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_localdec(i32 1)
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i54
i54:
  br label %i57
i57:
  %r57 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %ipfs57a
ipfs57a:
  %r57b = call i32 @hb_vmsh_pushnil()
  %c57b = icmp ne i32 %r57b, 0
  br i1 %c57b, label %epilogue, label %i60
i60:
  %r60 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %epilogue, label %i62
i62:
  %r62 = call i32 @hb_vmsh_do(i32 1)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i64
i64:
  br label %i67
i67:
  %r67 = call i32 @hb_vmsh_pushnil()
  %c67 = icmp ne i32 %r67, 0
  br i1 %c67, label %epilogue, label %i68
i68:
  %r68 = call i32 @hb_vmsh_retvalue()
  %c68 = icmp ne i32 %r68, 0
  br i1 %c68, label %epilogue, label %i69
i69:
  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([24 x i8], [24 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"

Program output

         6.00

compound2.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

/* compound2.prg — exercises compound-assignment opcodes not covered by compound.prg
 *
 * Shims hit by this program (new to the corpus):
 *   hb_vmsh_modeqpop    — n %= m  (statement form, variable RHS)
 *   hb_vmsh_expeqpop    — n ^= m  (statement form, variable RHS)
 *   hb_vmsh_minuseqpop  — n -= m  (statement form, variable RHS; optimizer
 *                                  keeps MINUSEQPOP only when RHS is non-constant)
 *   hb_vmsh_multeq      — ? (n *= m) (expr form, leaves result on stack)
 *   hb_vmsh_diveq       — ? (n /= m) (expr form)
 *   hb_vmsh_modeq       — ? (n %= m) (expr form)
 *   hb_vmsh_expeq       — ? (n ^= m) (expr form)
 *   hb_vmsh_pluseq      — ? (n += m) (expr form, variable RHS; constant RHS
 *                                  is optimised to localnearaddint + pushlocal)
 *   hb_vmsh_minuseq     — ? (n -= m) (expr form, variable RHS)
 */
function Main()
   local n := 64
   local m := 4

   /* --- statement forms (POP variants) --- */
   n -= m          /* minuseqpop  (variable RHS; constant would become addint) */
   n %= m          /* modeqpop                                                  */
   n := 64         /* reset                                                     */
   n ^= m          /* expeqpop  (n=64, m=4  →  64^4 = 16777216)               */

   /* --- expression forms (non-POP, result stays on stack) --- */
   n := 64
   ? ( n += m )    /* pluseq   — variable RHS keeps the non-POP form           */
   ? ( n -= m )    /* minuseq  — variable RHS                                  */
   ? ( n *= m )    /* multeq                                                    */
   ? ( n /= m )    /* diveq                                                     */
   n := 65
   ? ( n %= m )    /* modeq    (65 % 4 = 1)                                    */
   n := 2
   ? ( n ^= m )    /* expeq    (2^4 = 16)                                      */

   return nil

LLVM IR (459 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/compound2.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_COMPOUND2 = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [162 x i8] c"\0D\02\00\24\11\00\5C\40\50\01\24\12\00\5C\04\50\02\24\15\00\60\01\00\5F\02\88\24\16\00\60\01\00\5F\02\9A\24\17\00\5C\40\50\01\24\18\00\60\01\00\5F\02\9B\24\1B\00\5C\40\50\01\24\1C\00\B0\02\00\60\01\00\5F\02\8B\14\01\24\1D\00\B0\02\00\60\01\00\5F\02\8C\14\01\24\1E\00\B0\02\00\60\01\00\5F\02\8D\14\01\24\1F\00\B0\02\00\60\01\00\5F\02\8E\14\01\24\20\00\5C\41\50\01\24\21\00\B0\02\00\60\01\00\5F\02\9C\14\01\24\22\00\5C\02\50\01\24\23\00\B0\02\00\60\01\00\5F\02\9D\14\01\24\25\00\64\6E\07"

@.sym.0 = private constant [10 x i8] c"\43\4F\4D\50\4F\55\4E\44\32\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 [25 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\63\6F\6D\70\6F\75\6E\64\32\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_COMPOUND2 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 }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 64)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_poplocal(i32 1)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  br label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushint(i32 4)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 2)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_minuseqpop()
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i26
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_modeqpop()
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i35
i35:
  br label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushint(i32 64)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_poplocal(i32 1)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i48
i48:
  %r48 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_expeqpop()
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  br label %i54
i54:
  %r54 = call i32 @hb_vmsh_pushint(i32 64)
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_poplocal(i32 1)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i58
i58:
  br label %i61
i61:
  %r61 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c61 = icmp ne i32 %r61, 0
  br i1 %c61, label %epilogue, label %ipfs61a
ipfs61a:
  %r61b = call i32 @hb_vmsh_pushnil()
  %c61b = icmp ne i32 %r61b, 0
  br i1 %c61b, label %epilogue, label %i64
i64:
  %r64 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i67
i67:
  %r67 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c67 = icmp ne i32 %r67, 0
  br i1 %c67, label %epilogue, label %i69
i69:
  %r69 = call i32 @hb_vmsh_pluseq()
  %c69 = icmp ne i32 %r69, 0
  br i1 %c69, label %epilogue, label %i70
i70:
  %r70 = call i32 @hb_vmsh_do(i32 1)
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i72
i72:
  br label %i75
i75:
  %r75 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c75 = icmp ne i32 %r75, 0
  br i1 %c75, label %epilogue, label %ipfs75a
ipfs75a:
  %r75b = call i32 @hb_vmsh_pushnil()
  %c75b = icmp ne i32 %r75b, 0
  br i1 %c75b, label %epilogue, label %i78
i78:
  %r78 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c78 = icmp ne i32 %r78, 0
  br i1 %c78, label %epilogue, label %i81
i81:
  %r81 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c81 = icmp ne i32 %r81, 0
  br i1 %c81, label %epilogue, label %i83
i83:
  %r83 = call i32 @hb_vmsh_minuseq()
  %c83 = icmp ne i32 %r83, 0
  br i1 %c83, label %epilogue, label %i84
i84:
  %r84 = call i32 @hb_vmsh_do(i32 1)
  %c84 = icmp ne i32 %r84, 0
  br i1 %c84, label %epilogue, label %i86
i86:
  br label %i89
i89:
  %r89 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c89 = icmp ne i32 %r89, 0
  br i1 %c89, label %epilogue, label %ipfs89a
ipfs89a:
  %r89b = call i32 @hb_vmsh_pushnil()
  %c89b = icmp ne i32 %r89b, 0
  br i1 %c89b, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i95
i95:
  %r95 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c95 = icmp ne i32 %r95, 0
  br i1 %c95, label %epilogue, label %i97
i97:
  %r97 = call i32 @hb_vmsh_multeq()
  %c97 = icmp ne i32 %r97, 0
  br i1 %c97, label %epilogue, label %i98
i98:
  %r98 = call i32 @hb_vmsh_do(i32 1)
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i100
i100:
  br label %i103
i103:
  %r103 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c103 = icmp ne i32 %r103, 0
  br i1 %c103, label %epilogue, label %ipfs103a
ipfs103a:
  %r103b = call i32 @hb_vmsh_pushnil()
  %c103b = icmp ne i32 %r103b, 0
  br i1 %c103b, label %epilogue, label %i106
i106:
  %r106 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c106 = icmp ne i32 %r106, 0
  br i1 %c106, label %epilogue, label %i109
i109:
  %r109 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c109 = icmp ne i32 %r109, 0
  br i1 %c109, label %epilogue, label %i111
i111:
  %r111 = call i32 @hb_vmsh_diveq()
  %c111 = icmp ne i32 %r111, 0
  br i1 %c111, label %epilogue, label %i112
i112:
  %r112 = call i32 @hb_vmsh_do(i32 1)
  %c112 = icmp ne i32 %r112, 0
  br i1 %c112, label %epilogue, label %i114
i114:
  br label %i117
i117:
  %r117 = call i32 @hb_vmsh_pushint(i32 65)
  %c117 = icmp ne i32 %r117, 0
  br i1 %c117, label %epilogue, label %i119
i119:
  %r119 = call i32 @hb_vmsh_poplocal(i32 1)
  %c119 = icmp ne i32 %r119, 0
  br i1 %c119, label %epilogue, label %i121
i121:
  br label %i124
i124:
  %r124 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c124 = icmp ne i32 %r124, 0
  br i1 %c124, label %epilogue, label %ipfs124a
ipfs124a:
  %r124b = call i32 @hb_vmsh_pushnil()
  %c124b = icmp ne i32 %r124b, 0
  br i1 %c124b, label %epilogue, label %i127
i127:
  %r127 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c127 = icmp ne i32 %r127, 0
  br i1 %c127, label %epilogue, label %i130
i130:
  %r130 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c130 = icmp ne i32 %r130, 0
  br i1 %c130, label %epilogue, label %i132
i132:
  %r132 = call i32 @hb_vmsh_modeq()
  %c132 = icmp ne i32 %r132, 0
  br i1 %c132, label %epilogue, label %i133
i133:
  %r133 = call i32 @hb_vmsh_do(i32 1)
  %c133 = icmp ne i32 %r133, 0
  br i1 %c133, label %epilogue, label %i135
i135:
  br label %i138
i138:
  %r138 = call i32 @hb_vmsh_pushint(i32 2)
  %c138 = icmp ne i32 %r138, 0
  br i1 %c138, label %epilogue, label %i140
i140:
  %r140 = call i32 @hb_vmsh_poplocal(i32 1)
  %c140 = icmp ne i32 %r140, 0
  br i1 %c140, label %epilogue, label %i142
i142:
  br label %i145
i145:
  %r145 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c145 = icmp ne i32 %r145, 0
  br i1 %c145, label %epilogue, label %ipfs145a
ipfs145a:
  %r145b = call i32 @hb_vmsh_pushnil()
  %c145b = icmp ne i32 %r145b, 0
  br i1 %c145b, label %epilogue, label %i148
i148:
  %r148 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c148 = icmp ne i32 %r148, 0
  br i1 %c148, label %epilogue, label %i151
i151:
  %r151 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c151 = icmp ne i32 %r151, 0
  br i1 %c151, label %epilogue, label %i153
i153:
  %r153 = call i32 @hb_vmsh_expeq()
  %c153 = icmp ne i32 %r153, 0
  br i1 %c153, label %epilogue, label %i154
i154:
  %r154 = call i32 @hb_vmsh_do(i32 1)
  %c154 = icmp ne i32 %r154, 0
  br i1 %c154, label %epilogue, label %i156
i156:
  br label %i159
i159:
  %r159 = call i32 @hb_vmsh_pushnil()
  %c159 = icmp ne i32 %r159, 0
  br i1 %c159, label %epilogue, label %i160
i160:
  %r160 = call i32 @hb_vmsh_retvalue()
  %c160 = icmp ne i32 %r160, 0
  br i1 %c160, label %epilogue, label %i161
i161:
  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([25 x i8], [25 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"

Program output

        68
        64
       256
        64.00
         1.00
        16.00

dbfield.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local cFile := "build/grpc_test.dbf"
   dbCreate( cFile, { { "NAME", "C", 10, 0 }, { "AGE", "N", 3, 0 } } )
   dbUseArea( .T., , cFile, "T" )
   dbAppend()
   T->NAME := "Harbour"
   T->AGE  := 35
   ? T->NAME, T->AGE
   dbCloseArea()
   FErase( cFile )
   return nil

LLVM IR (459 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/dbfield.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_DBCREATE()
declare void @HB_FUN_DBUSEAREA()
declare void @HB_FUN_DBAPPEND()
declare void @HB_FUN_QOUT()
declare void @HB_FUN_DBCLOSEAREA()
declare void @HB_FUN_FERASE()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_DBFIELD = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [166 x i8] c"\0D\01\00\24\02\00\6A\14\62\75\69\6C\64\2F\67\72\70\63\5F\74\65\73\74\2E\64\62\66\00\50\01\24\03\00\B0\02\00\5F\01\6A\05\4E\41\4D\45\00\6A\02\43\00\5C\0A\79\04\04\00\6A\04\41\47\45\00\6A\02\4E\00\5C\03\79\04\04\00\04\02\00\14\02\24\04\00\B0\03\00\78\64\5F\01\6A\02\54\00\14\04\24\05\00\B0\04\00\14\00\24\06\00\6A\08\48\61\72\62\6F\75\72\00\6C\05\4C\06\24\07\00\5C\23\6C\05\4C\07\24\08\00\B0\08\00\6C\05\57\06\6C\05\57\07\14\02\24\09\00\B0\09\00\14\00\24\0A\00\B0\0A\00\5F\01\14\01\24\0B\00\64\6E\07"

@.sym.0 = private constant [8 x i8] c"\44\42\46\49\45\4C\44\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [9 x i8] c"\44\42\43\52\45\41\54\45\00"
@.sym.3 = private constant [10 x i8] c"\44\42\55\53\45\41\52\45\41\00"
@.sym.4 = private constant [9 x i8] c"\44\42\41\50\50\45\4E\44\00"
@.sym.5 = private constant [2 x i8] c"\54\00"
@.sym.6 = private constant [5 x i8] c"\4E\41\4D\45\00"
@.sym.7 = private constant [4 x i8] c"\41\47\45\00"
@.sym.8 = private constant [5 x i8] c"\51\4F\55\54\00"
@.sym.9 = private constant [12 x i8] c"\44\42\43\4C\4F\53\45\41\52\45\41\00"
@.sym.10 = private constant [7 x i8] c"\46\45\52\41\53\45\00"

@.modname = private constant [23 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\64\62\66\69\65\6C\64\2E\70\72\67\00"

@symbols_table = internal global [11 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_DBFIELD 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([9 x i8], [9 x i8]* @.sym.2, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_DBCREATE to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_DBUSEAREA to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.4, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_DBAPPEND to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([2 x i8], [2 x i8]* @.sym.5, i32 0, i32 0),
           i64 1,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.6, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.7, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.8, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.9, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_DBCLOSEAREA to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([7 x i8], [7 x i8]* @.sym.10, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_FERASE to i8*),
           i8* null }
]

@.sl.str.0 = private constant [20 x i8] c"\62\75\69\6C\64\2F\67\72\70\63\5F\74\65\73\74\2E\64\62\66\00"
@.sl.str.1 = private constant [5 x i8] c"\4E\41\4D\45\00"
@.sl.str.2 = private constant [2 x i8] c"\43\00"
@.sl.str.3 = private constant [4 x i8] c"\41\47\45\00"
@.sl.str.4 = private constant [2 x i8] c"\4E\00"
@.sl.str.5 = private constant [2 x i8] c"\54\00"
@.sl.str.6 = private constant [8 x i8] c"\48\61\72\62\6F\75\72\00"

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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([20 x i8], [20 x i8]* @.sl.str.0, i32 0, i32 0), i64 19)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_poplocal(i32 1)
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i30
i30:
  br label %i33
i33:
  %r33 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %ipfs33a
ipfs33a:
  %r33b = call i32 @hb_vmsh_pushnil()
  %c33b = icmp ne i32 %r33b, 0
  br i1 %c33b, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushstring(i8* getelementptr([5 x i8], [5 x i8]* @.sl.str.1, i32 0, i32 0), i64 4)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.2, i32 0, i32 0), i64 1)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i49
i49:
  %r49 = call i32 @hb_vmsh_pushint(i32 10)
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushint(i32 0)
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i52
i52:
  %r52 = call i32 @hb_vmsh_arraygen(i32 4)
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.3, i32 0, i32 0), i64 3)
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i61
i61:
  %r61 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.4, i32 0, i32 0), i64 1)
  %c61 = icmp ne i32 %r61, 0
  br i1 %c61, label %epilogue, label %i65
i65:
  %r65 = call i32 @hb_vmsh_pushint(i32 3)
  %c65 = icmp ne i32 %r65, 0
  br i1 %c65, label %epilogue, label %i67
i67:
  %r67 = call i32 @hb_vmsh_pushint(i32 0)
  %c67 = icmp ne i32 %r67, 0
  br i1 %c67, label %epilogue, label %i68
i68:
  %r68 = call i32 @hb_vmsh_arraygen(i32 4)
  %c68 = icmp ne i32 %r68, 0
  br i1 %c68, label %epilogue, label %i71
i71:
  %r71 = call i32 @hb_vmsh_arraygen(i32 2)
  %c71 = icmp ne i32 %r71, 0
  br i1 %c71, label %epilogue, label %i74
i74:
  %r74 = call i32 @hb_vmsh_do(i32 2)
  %c74 = icmp ne i32 %r74, 0
  br i1 %c74, label %epilogue, label %i76
i76:
  br label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %ipfs79a
ipfs79a:
  %r79b = call i32 @hb_vmsh_pushnil()
  %c79b = icmp ne i32 %r79b, 0
  br i1 %c79b, label %epilogue, label %i82
i82:
  %r82 = call i32 @hb_vmsh_pushlogical(i32 1)
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %epilogue, label %i83
i83:
  %r83 = call i32 @hb_vmsh_pushnil()
  %c83 = icmp ne i32 %r83, 0
  br i1 %c83, label %epilogue, label %i84
i84:
  %r84 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c84 = icmp ne i32 %r84, 0
  br i1 %c84, label %epilogue, label %i86
i86:
  %r86 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.5, i32 0, i32 0), i64 1)
  %c86 = icmp ne i32 %r86, 0
  br i1 %c86, label %epilogue, label %i90
i90:
  %r90 = call i32 @hb_vmsh_do(i32 4)
  %c90 = icmp ne i32 %r90, 0
  br i1 %c90, label %epilogue, label %i92
i92:
  br label %i95
i95:
  %r95 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c95 = icmp ne i32 %r95, 0
  br i1 %c95, label %epilogue, label %ipfs95a
ipfs95a:
  %r95b = call i32 @hb_vmsh_pushnil()
  %c95b = icmp ne i32 %r95b, 0
  br i1 %c95b, label %epilogue, label %i98
i98:
  %r98 = call i32 @hb_vmsh_do(i32 0)
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i100
i100:
  br label %i103
i103:
  %r103 = call i32 @hb_vmsh_pushstring(i8* getelementptr([8 x i8], [8 x i8]* @.sl.str.6, i32 0, i32 0), i64 7)
  %c103 = icmp ne i32 %r103, 0
  br i1 %c103, label %epilogue, label %i113
i113:
  %r113 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c113 = icmp ne i32 %r113, 0
  br i1 %c113, label %epilogue, label %i115
i115:
  %r115 = call i32 @hb_vmsh_popaliasedfield(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c115 = icmp ne i32 %r115, 0
  br i1 %c115, label %epilogue, label %i117
i117:
  br label %i120
i120:
  %r120 = call i32 @hb_vmsh_pushint(i32 35)
  %c120 = icmp ne i32 %r120, 0
  br i1 %c120, label %epilogue, label %i122
i122:
  %r122 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c122 = icmp ne i32 %r122, 0
  br i1 %c122, label %epilogue, label %i124
i124:
  %r124 = call i32 @hb_vmsh_popaliasedfield(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c124 = icmp ne i32 %r124, 0
  br i1 %c124, label %epilogue, label %i126
i126:
  br label %i129
i129:
  %r129 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 8))
  %c129 = icmp ne i32 %r129, 0
  br i1 %c129, label %epilogue, label %ipfs129a
ipfs129a:
  %r129b = call i32 @hb_vmsh_pushnil()
  %c129b = icmp ne i32 %r129b, 0
  br i1 %c129b, label %epilogue, label %i132
i132:
  %r132 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c132 = icmp ne i32 %r132, 0
  br i1 %c132, label %epilogue, label %i134
i134:
  %r134 = call i32 @hb_vmsh_pushaliasedfield(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c134 = icmp ne i32 %r134, 0
  br i1 %c134, label %epilogue, label %i136
i136:
  %r136 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c136 = icmp ne i32 %r136, 0
  br i1 %c136, label %epilogue, label %i138
i138:
  %r138 = call i32 @hb_vmsh_pushaliasedfield(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c138 = icmp ne i32 %r138, 0
  br i1 %c138, label %epilogue, label %i140
i140:
  %r140 = call i32 @hb_vmsh_do(i32 2)
  %c140 = icmp ne i32 %r140, 0
  br i1 %c140, label %epilogue, label %i142
i142:
  br label %i145
i145:
  %r145 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c145 = icmp ne i32 %r145, 0
  br i1 %c145, label %epilogue, label %ipfs145a
ipfs145a:
  %r145b = call i32 @hb_vmsh_pushnil()
  %c145b = icmp ne i32 %r145b, 0
  br i1 %c145b, label %epilogue, label %i148
i148:
  %r148 = call i32 @hb_vmsh_do(i32 0)
  %c148 = icmp ne i32 %r148, 0
  br i1 %c148, label %epilogue, label %i150
i150:
  br label %i153
i153:
  %r153 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c153 = icmp ne i32 %r153, 0
  br i1 %c153, label %epilogue, label %ipfs153a
ipfs153a:
  %r153b = call i32 @hb_vmsh_pushnil()
  %c153b = icmp ne i32 %r153b, 0
  br i1 %c153b, label %epilogue, label %i156
i156:
  %r156 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c156 = icmp ne i32 %r156, 0
  br i1 %c156, label %epilogue, label %i158
i158:
  %r158 = call i32 @hb_vmsh_do(i32 1)
  %c158 = icmp ne i32 %r158, 0
  br i1 %c158, label %epilogue, label %i160
i160:
  br label %i163
i163:
  %r163 = call i32 @hb_vmsh_pushnil()
  %c163 = icmp ne i32 %r163, 0
  br i1 %c163, label %epilogue, label %i164
i164:
  %r164 = call i32 @hb_vmsh_retvalue()
  %c164 = icmp ne i32 %r164, 0
  br i1 %c164, label %epilogue, label %i165
i165:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([11 x %HB_SYMB], [11 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 11,
    i8* getelementptr([23 x i8], [23 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"

Program output

Harbour     35

fallback.prg

IR ok run ok fallback ok

fallback: hb_vmExecute call present in HB_FUN_MAIN (expected)

xBase source

//
// Sentinel: this program MUST fall back to hb_vmExecute. Uses a timestamp
// literal {^ ... }, which emits HB_P_PUSHTIMESTAMP (opcode 22, HB_FALSE in
// the straight-line decoder), forcing whole-function fallback. Distinct
// from statics.prg (HB_P_SFRAME) so the sentinels exercise different
// unsupported paths.
//
function Main()
   local dStamp := {^ 2026-01-01 12:00:00 }
   ? hb_TToS( dStamp )
   return nil

LLVM IR (190 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/fallback.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()
declare void @HB_FUN_HB_TTOS()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_FALLBACK = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [38 x i8] c"\0D\01\00\24\09\00\16\72\8D\25\00\00\2E\93\02\50\01\24\0A\00\B0\02\00\B0\03\00\5F\01\0C\01\14\01\24\0B\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\46\41\4C\4C\42\41\43\4B\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"
@.sym.3 = private constant [8 x i8] c"\48\42\5F\54\54\4F\53\00"

@.modname = private constant [24 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\66\61\6C\6C\62\61\63\6B\2E\70\72\67\00"

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_FALLBACK 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 },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_HB_TTOS to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
  %s = load %HB_SYMB*, %HB_SYMB** @symbols
  call void @hb_vmExecute(i8* getelementptr([38 x i8], [38 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 0), %HB_SYMB* %s)
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([24 x i8], [24 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"

Program output

20260101120000000

foreach.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local x, nSum := 0, cJoin := "", nDesc := 0
   for each x in { 10, 20, 30, 40 }
      nSum += x
   next
   for each x in "abc"
      cJoin += x
   next
   for each x in { 1, 2, 3, 4, 5 } descend
      nDesc := nDesc * 10 + x
   next
   ? nSum
   ? cJoin
   ? nDesc
   return nil

LLVM IR (499 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/foreach.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_FOREACH = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [167 x i8] c"\0D\04\00\24\02\00\79\50\02\6A\01\00\50\03\79\50\04\24\03\00\5C\0A\5C\14\5C\1E\5C\28\04\04\00\60\01\00\81\01\01\1C\11\24\04\00\60\02\00\5F\01\87\24\05\00\82\1F\F3\84\24\06\00\6A\04\61\62\63\00\60\01\00\81\01\01\1C\11\24\07\00\60\03\00\5F\01\87\24\08\00\82\1F\F3\84\24\09\00\7A\5C\02\5C\03\5C\04\5C\05\04\05\00\60\01\00\81\01\00\1C\15\24\0A\00\5F\04\5C\0A\41\5F\01\48\50\04\24\0B\00\83\1F\EF\84\24\0C\00\B0\02\00\5F\02\14\01\24\0D\00\B0\02\00\5F\03\14\01\24\0E\00\B0\02\00\5F\04\14\01\24\0F\00\64\6E\07"

@.sym.0 = private constant [8 x i8] c"\46\4F\52\45\41\43\48\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 [23 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\66\6F\72\65\61\63\68\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_FOREACH 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 [1 x i8] c"\00"
@.sl.str.1 = private constant [4 x i8] c"\61\62\63\00"

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

define void @HB_FUN_MAIN() {
entry:
  %jp37 = alloca i32
  %jp52 = alloca i32
  %jp70 = alloca i32
  %jp85 = alloca i32
  %jp109 = alloca i32
  %jp128 = alloca i32
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 4, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 0)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_poplocal(i32 2)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushstring(i8* getelementptr([1 x i8], [1 x i8]* @.sl.str.0, i32 0, i32 0), i64 0)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_poplocal(i32 3)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pushint(i32 0)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 4)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushint(i32 10)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushint(i32 20)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushint(i32 30)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_pushint(i32 40)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_arraygen(i32 4)
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_enumstart(i32 1, i32 1)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i37
i37:
  %rjp37 = call i32 @hb_vmsh_poplogical(i32* %jp37)
  %cjp37 = icmp ne i32 %rjp37, 0
  br i1 %cjp37, label %epilogue, label %jpdone37
jpdone37:
  %vjp37 = load i32, i32* %jp37
  %bjp37 = icmp ne i32 %vjp37, 0
  br i1 %bjp37, label %i39, label %i54
i39:
  br label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushlocalref(i32 2)
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_pluseqpop()
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_enumnext()
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i52
i52:
  %rjp52 = call i32 @hb_vmsh_poplogical(i32* %jp52)
  %cjp52 = icmp ne i32 %rjp52, 0
  br i1 %cjp52, label %epilogue, label %jpdone52
jpdone52:
  %vjp52 = load i32, i32* %jp52
  %bjp52 = icmp ne i32 %vjp52, 0
  br i1 %bjp52, label %i39, label %i54
i54:
  %r54 = call i32 @hb_vmsh_enumend()
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %i55
i55:
  br label %i58
i58:
  %r58 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.1, i32 0, i32 0), i64 3)
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i64
i64:
  %r64 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i67
i67:
  %r67 = call i32 @hb_vmsh_enumstart(i32 1, i32 1)
  %c67 = icmp ne i32 %r67, 0
  br i1 %c67, label %epilogue, label %i70
i70:
  %rjp70 = call i32 @hb_vmsh_poplogical(i32* %jp70)
  %cjp70 = icmp ne i32 %rjp70, 0
  br i1 %cjp70, label %epilogue, label %jpdone70
jpdone70:
  %vjp70 = load i32, i32* %jp70
  %bjp70 = icmp ne i32 %vjp70, 0
  br i1 %bjp70, label %i72, label %i87
i72:
  br label %i75
i75:
  %r75 = call i32 @hb_vmsh_pushlocalref(i32 3)
  %c75 = icmp ne i32 %r75, 0
  br i1 %c75, label %epilogue, label %i78
i78:
  %r78 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c78 = icmp ne i32 %r78, 0
  br i1 %c78, label %epilogue, label %i80
i80:
  %r80 = call i32 @hb_vmsh_pluseqpop()
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i81
i81:
  br label %i84
i84:
  %r84 = call i32 @hb_vmsh_enumnext()
  %c84 = icmp ne i32 %r84, 0
  br i1 %c84, label %epilogue, label %i85
i85:
  %rjp85 = call i32 @hb_vmsh_poplogical(i32* %jp85)
  %cjp85 = icmp ne i32 %rjp85, 0
  br i1 %cjp85, label %epilogue, label %jpdone85
jpdone85:
  %vjp85 = load i32, i32* %jp85
  %bjp85 = icmp ne i32 %vjp85, 0
  br i1 %bjp85, label %i72, label %i87
i87:
  %r87 = call i32 @hb_vmsh_enumend()
  %c87 = icmp ne i32 %r87, 0
  br i1 %c87, label %epilogue, label %i88
i88:
  br label %i91
i91:
  %r91 = call i32 @hb_vmsh_pushint(i32 1)
  %c91 = icmp ne i32 %r91, 0
  br i1 %c91, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_pushint(i32 2)
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i94
i94:
  %r94 = call i32 @hb_vmsh_pushint(i32 3)
  %c94 = icmp ne i32 %r94, 0
  br i1 %c94, label %epilogue, label %i96
i96:
  %r96 = call i32 @hb_vmsh_pushint(i32 4)
  %c96 = icmp ne i32 %r96, 0
  br i1 %c96, label %epilogue, label %i98
i98:
  %r98 = call i32 @hb_vmsh_pushint(i32 5)
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i100
i100:
  %r100 = call i32 @hb_vmsh_arraygen(i32 5)
  %c100 = icmp ne i32 %r100, 0
  br i1 %c100, label %epilogue, label %i103
i103:
  %r103 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c103 = icmp ne i32 %r103, 0
  br i1 %c103, label %epilogue, label %i106
i106:
  %r106 = call i32 @hb_vmsh_enumstart(i32 1, i32 0)
  %c106 = icmp ne i32 %r106, 0
  br i1 %c106, label %epilogue, label %i109
i109:
  %rjp109 = call i32 @hb_vmsh_poplogical(i32* %jp109)
  %cjp109 = icmp ne i32 %rjp109, 0
  br i1 %cjp109, label %epilogue, label %jpdone109
jpdone109:
  %vjp109 = load i32, i32* %jp109
  %bjp109 = icmp ne i32 %vjp109, 0
  br i1 %bjp109, label %i111, label %i130
i111:
  br label %i114
i114:
  %r114 = call i32 @hb_vmsh_pushlocal(i32 4)
  %c114 = icmp ne i32 %r114, 0
  br i1 %c114, label %epilogue, label %i116
i116:
  %r116 = call i32 @hb_vmsh_pushint(i32 10)
  %c116 = icmp ne i32 %r116, 0
  br i1 %c116, label %epilogue, label %i118
i118:
  %r118 = call i32 @hb_vmsh_mult()
  %c118 = icmp ne i32 %r118, 0
  br i1 %c118, label %epilogue, label %i119
i119:
  %r119 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c119 = icmp ne i32 %r119, 0
  br i1 %c119, label %epilogue, label %i121
i121:
  %r121 = call i32 @hb_vmsh_plus()
  %c121 = icmp ne i32 %r121, 0
  br i1 %c121, label %epilogue, label %i122
i122:
  %r122 = call i32 @hb_vmsh_poplocal(i32 4)
  %c122 = icmp ne i32 %r122, 0
  br i1 %c122, label %epilogue, label %i124
i124:
  br label %i127
i127:
  %r127 = call i32 @hb_vmsh_enumprev()
  %c127 = icmp ne i32 %r127, 0
  br i1 %c127, label %epilogue, label %i128
i128:
  %rjp128 = call i32 @hb_vmsh_poplogical(i32* %jp128)
  %cjp128 = icmp ne i32 %rjp128, 0
  br i1 %cjp128, label %epilogue, label %jpdone128
jpdone128:
  %vjp128 = load i32, i32* %jp128
  %bjp128 = icmp ne i32 %vjp128, 0
  br i1 %bjp128, label %i111, label %i130
i130:
  %r130 = call i32 @hb_vmsh_enumend()
  %c130 = icmp ne i32 %r130, 0
  br i1 %c130, label %epilogue, label %i131
i131:
  br label %i134
i134:
  %r134 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c134 = icmp ne i32 %r134, 0
  br i1 %c134, label %epilogue, label %ipfs134a
ipfs134a:
  %r134b = call i32 @hb_vmsh_pushnil()
  %c134b = icmp ne i32 %r134b, 0
  br i1 %c134b, label %epilogue, label %i137
i137:
  %r137 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c137 = icmp ne i32 %r137, 0
  br i1 %c137, label %epilogue, label %i139
i139:
  %r139 = call i32 @hb_vmsh_do(i32 1)
  %c139 = icmp ne i32 %r139, 0
  br i1 %c139, label %epilogue, label %i141
i141:
  br label %i144
i144:
  %r144 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c144 = icmp ne i32 %r144, 0
  br i1 %c144, label %epilogue, label %ipfs144a
ipfs144a:
  %r144b = call i32 @hb_vmsh_pushnil()
  %c144b = icmp ne i32 %r144b, 0
  br i1 %c144b, label %epilogue, label %i147
i147:
  %r147 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c147 = icmp ne i32 %r147, 0
  br i1 %c147, label %epilogue, label %i149
i149:
  %r149 = call i32 @hb_vmsh_do(i32 1)
  %c149 = icmp ne i32 %r149, 0
  br i1 %c149, label %epilogue, label %i151
i151:
  br label %i154
i154:
  %r154 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c154 = icmp ne i32 %r154, 0
  br i1 %c154, label %epilogue, label %ipfs154a
ipfs154a:
  %r154b = call i32 @hb_vmsh_pushnil()
  %c154b = icmp ne i32 %r154b, 0
  br i1 %c154b, label %epilogue, label %i157
i157:
  %r157 = call i32 @hb_vmsh_pushlocal(i32 4)
  %c157 = icmp ne i32 %r157, 0
  br i1 %c157, label %epilogue, label %i159
i159:
  %r159 = call i32 @hb_vmsh_do(i32 1)
  %c159 = icmp ne i32 %r159, 0
  br i1 %c159, label %epilogue, label %i161
i161:
  br label %i164
i164:
  %r164 = call i32 @hb_vmsh_pushnil()
  %c164 = icmp ne i32 %r164, 0
  br i1 %c164, label %epilogue, label %i165
i165:
  %r165 = call i32 @hb_vmsh_retvalue()
  %c165 = icmp ne i32 %r165, 0
  br i1 %c165, label %epilogue, label %i166
i166:
  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([23 x i8], [23 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"

Program output

       100
abc
     54321

forstep.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local i, nSum := 0
   for i := 10 to 1 step -2
      nSum += i
   next
   for i := 0 to 20 step 5
      nSum += i
   next
   ? nSum
   return nil

LLVM IR (343 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/forstep.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_FORSTEP = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [89 x i8] c"\0D\02\00\24\02\00\79\50\02\24\03\00\5C\0A\A5\50\01\19\14\24\04\00\60\02\00\5F\01\87\24\03\00\7E\01\FE\FF\5F\01\7A\23\1C\EC\24\06\00\79\A5\50\01\19\14\24\07\00\60\02\00\5F\01\87\24\06\00\7E\01\05\00\5F\01\5C\14\0F\1C\EB\24\09\00\B0\02\00\5F\02\14\01\24\0A\00\64\6E\07"

@.sym.0 = private constant [8 x i8] c"\46\4F\52\53\54\45\50\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 [23 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\66\6F\72\73\74\65\70\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_FORSTEP 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 }
]


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

define void @HB_FUN_MAIN() {
entry:
  %jp39 = alloca i32
  %jp71 = alloca i32
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 0)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_poplocal(i32 2)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  br label %i12
i12:
  %r12 = call i32 @hb_vmsh_pushint(i32 10)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pushunref()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i37
i19:
  br label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushlocalref(i32 2)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_pluseqpop()
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i28
i28:
  br label %i31
i31:
  %r31 = call i32 @hb_vmsh_localnearaddint(i32 1, i32 -2)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushint(i32 1)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_less()
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i39
i39:
  %rjp39 = call i32 @hb_vmsh_poplogical(i32* %jp39)
  %cjp39 = icmp ne i32 %rjp39, 0
  br i1 %cjp39, label %epilogue, label %jpdone39
jpdone39:
  %vjp39 = load i32, i32* %jp39
  %bjp39 = icmp ne i32 %vjp39, 0
  br i1 %bjp39, label %i41, label %i19
i41:
  br label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushint(i32 0)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushunref()
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_poplocal(i32 1)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  br label %i68
i50:
  br label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushlocalref(i32 2)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_pluseqpop()
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i59
i59:
  br label %i62
i62:
  %r62 = call i32 @hb_vmsh_localnearaddint(i32 1, i32 5)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i66
i66:
  %r66 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c66 = icmp ne i32 %r66, 0
  br i1 %c66, label %epilogue, label %i68
i68:
  %r68 = call i32 @hb_vmsh_pushint(i32 20)
  %c68 = icmp ne i32 %r68, 0
  br i1 %c68, label %epilogue, label %i70
i70:
  %r70 = call i32 @hb_vmsh_greater()
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i71
i71:
  %rjp71 = call i32 @hb_vmsh_poplogical(i32* %jp71)
  %cjp71 = icmp ne i32 %rjp71, 0
  br i1 %cjp71, label %epilogue, label %jpdone71
jpdone71:
  %vjp71 = load i32, i32* %jp71
  %bjp71 = icmp ne i32 %vjp71, 0
  br i1 %bjp71, label %i73, label %i50
i73:
  br label %i76
i76:
  %r76 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c76 = icmp ne i32 %r76, 0
  br i1 %c76, label %epilogue, label %ipfs76a
ipfs76a:
  %r76b = call i32 @hb_vmsh_pushnil()
  %c76b = icmp ne i32 %r76b, 0
  br i1 %c76b, label %epilogue, label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %i81
i81:
  %r81 = call i32 @hb_vmsh_do(i32 1)
  %c81 = icmp ne i32 %r81, 0
  br i1 %c81, label %epilogue, label %i83
i83:
  br label %i86
i86:
  %r86 = call i32 @hb_vmsh_pushnil()
  %c86 = icmp ne i32 %r86, 0
  br i1 %c86, label %epilogue, label %i87
i87:
  %r87 = call i32 @hb_vmsh_retvalue()
  %c87 = icmp ne i32 %r87, 0
  br i1 %c87, label %epilogue, label %i88
i88:
  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([23 x i8], [23 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"

Program output

        80

forstep_var.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

/* forstep_var.prg — FOR loop with a variable (runtime) step value
 *
 * Shims hit by this program (new to the corpus):
 *   hb_vmsh_fortest     — emitted by FOR loops whose step is not a compile-time
 *                         constant; fortest tests the sign of the step value to
 *                         decide whether the loop guard is < or >
 *   hb_vmsh_pluseq      — the loop counter increment uses PUSHLOCALREF + step +
 *                         PLUSEQ (non-POP form) when step is a variable
 *
 * (pushunref is already exercised by loop.prg and forstep.prg)
 */
function Main()
   local i, nSum := 0
   local nStep := 2

   /* step is a variable — compiler emits HB_P_FORTEST to handle either sign */
   for i := 1 to 10 step nStep
      nSum += i
   next
   ? nSum          /* 1+3+5+7+9 = 25 */

   /* negative variable step */
   nStep := -3
   for i := 10 to 1 step nStep
      nSum += i
   next
   ? nSum          /* 25 + (10+7+4+1) = 25+22 = 47 */

   return nil

LLVM IR (397 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/forstep_var.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_FORSTEP_VAR = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [117 x i8] c"\0D\03\00\24\0D\00\79\50\02\24\0E\00\5C\02\50\03\24\11\00\7A\A5\50\01\19\14\24\12\00\60\02\00\5F\01\87\24\11\00\60\01\00\5F\03\8B\5C\0A\5F\03\0A\1C\E9\24\14\00\B0\02\00\5F\02\14\01\24\17\00\5C\FD\50\03\24\18\00\5C\0A\A5\50\01\19\14\24\19\00\60\02\00\5F\01\87\24\18\00\60\01\00\5F\03\8B\7A\5F\03\0A\1C\EA\24\1B\00\B0\02\00\5F\02\14\01\24\1D\00\64\6E\07"

@.sym.0 = private constant [12 x i8] c"\46\4F\52\53\54\45\50\5F\56\41\52\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 [27 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\66\6F\72\73\74\65\70\5F\76\61\72\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_FORSTEP_VAR 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 }
]


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

define void @HB_FUN_MAIN() {
entry:
  %jp48 = alloca i32
  %jp99 = alloca i32
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 3, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 0)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_poplocal(i32 2)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  br label %i12
i12:
  %r12 = call i32 @hb_vmsh_pushint(i32 2)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 3)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushint(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushunref()
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_poplocal(i32 1)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i23
i23:
  br label %i43
i25:
  br label %i28
i28:
  %r28 = call i32 @hb_vmsh_pushlocalref(i32 2)
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_pluseqpop()
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i34
i34:
  br label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  %r42 = call i32 @hb_vmsh_pluseq()
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushint(i32 10)
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_fortest()
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i48
i48:
  %rjp48 = call i32 @hb_vmsh_poplogical(i32* %jp48)
  %cjp48 = icmp ne i32 %rjp48, 0
  br i1 %cjp48, label %epilogue, label %jpdone48
jpdone48:
  %vjp48 = load i32, i32* %jp48
  %bjp48 = icmp ne i32 %vjp48, 0
  br i1 %bjp48, label %i50, label %i25
i50:
  br label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %ipfs53a
ipfs53a:
  %r53b = call i32 @hb_vmsh_pushnil()
  %c53b = icmp ne i32 %r53b, 0
  br i1 %c53b, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_do(i32 1)
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i60
i60:
  br label %i63
i63:
  %r63 = call i32 @hb_vmsh_pushint(i32 -3)
  %c63 = icmp ne i32 %r63, 0
  br i1 %c63, label %epilogue, label %i65
i65:
  %r65 = call i32 @hb_vmsh_poplocal(i32 3)
  %c65 = icmp ne i32 %r65, 0
  br i1 %c65, label %epilogue, label %i67
i67:
  br label %i70
i70:
  %r70 = call i32 @hb_vmsh_pushint(i32 10)
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i72
i72:
  %r72 = call i32 @hb_vmsh_pushunref()
  %c72 = icmp ne i32 %r72, 0
  br i1 %c72, label %epilogue, label %i73
i73:
  %r73 = call i32 @hb_vmsh_poplocal(i32 1)
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %epilogue, label %i75
i75:
  br label %i95
i77:
  br label %i80
i80:
  %r80 = call i32 @hb_vmsh_pushlocalref(i32 2)
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i83
i83:
  %r83 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c83 = icmp ne i32 %r83, 0
  br i1 %c83, label %epilogue, label %i85
i85:
  %r85 = call i32 @hb_vmsh_pluseqpop()
  %c85 = icmp ne i32 %r85, 0
  br i1 %c85, label %epilogue, label %i86
i86:
  br label %i89
i89:
  %r89 = call i32 @hb_vmsh_pushlocalref(i32 1)
  %c89 = icmp ne i32 %r89, 0
  br i1 %c89, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i94
i94:
  %r94 = call i32 @hb_vmsh_pluseq()
  %c94 = icmp ne i32 %r94, 0
  br i1 %c94, label %epilogue, label %i95
i95:
  %r95 = call i32 @hb_vmsh_pushint(i32 1)
  %c95 = icmp ne i32 %r95, 0
  br i1 %c95, label %epilogue, label %i96
i96:
  %r96 = call i32 @hb_vmsh_pushlocal(i32 3)
  %c96 = icmp ne i32 %r96, 0
  br i1 %c96, label %epilogue, label %i98
i98:
  %r98 = call i32 @hb_vmsh_fortest()
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i99
i99:
  %rjp99 = call i32 @hb_vmsh_poplogical(i32* %jp99)
  %cjp99 = icmp ne i32 %rjp99, 0
  br i1 %cjp99, label %epilogue, label %jpdone99
jpdone99:
  %vjp99 = load i32, i32* %jp99
  %bjp99 = icmp ne i32 %vjp99, 0
  br i1 %bjp99, label %i101, label %i77
i101:
  br label %i104
i104:
  %r104 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c104 = icmp ne i32 %r104, 0
  br i1 %c104, label %epilogue, label %ipfs104a
ipfs104a:
  %r104b = call i32 @hb_vmsh_pushnil()
  %c104b = icmp ne i32 %r104b, 0
  br i1 %c104b, label %epilogue, label %i107
i107:
  %r107 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c107 = icmp ne i32 %r107, 0
  br i1 %c107, label %epilogue, label %i109
i109:
  %r109 = call i32 @hb_vmsh_do(i32 1)
  %c109 = icmp ne i32 %r109, 0
  br i1 %c109, label %epilogue, label %i111
i111:
  br label %i114
i114:
  %r114 = call i32 @hb_vmsh_pushnil()
  %c114 = icmp ne i32 %r114, 0
  br i1 %c114, label %epilogue, label %i115
i115:
  %r115 = call i32 @hb_vmsh_retvalue()
  %c115 = icmp ne i32 %r115, 0
  br i1 %c115, label %epilogue, label %i116
i116:
  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([27 x i8], [27 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"

Program output

        25
        47

hashlit.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local h := { "one" => 1, "two" => 2, "three" => 3 }
   ? h[ "one" ], h[ "two" ], h[ "three" ]
   ? Len( h )
   return nil

LLVM IR (327 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/hashlit.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()
declare void @HB_FUN_LEN()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_HASHLIT = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [94 x i8] c"\0D\01\00\24\02\00\6A\04\6F\6E\65\00\7A\6A\04\74\77\6F\00\5C\02\6A\06\74\68\72\65\65\00\5C\03\B1\03\00\50\01\24\03\00\B0\02\00\5F\01\6A\04\6F\6E\65\00\01\5F\01\6A\04\74\77\6F\00\01\5F\01\6A\06\74\68\72\65\65\00\01\14\03\24\04\00\B0\02\00\B0\03\00\5F\01\0C\01\14\01\24\05\00\64\6E\07"

@.sym.0 = private constant [8 x i8] c"\48\41\53\48\4C\49\54\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"
@.sym.3 = private constant [4 x i8] c"\4C\45\4E\00"

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

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_HASHLIT 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 },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_LEN to i8*),
           i8* null }
]

@.sl.str.0 = private constant [4 x i8] c"\6F\6E\65\00"
@.sl.str.1 = private constant [4 x i8] c"\74\77\6F\00"
@.sl.str.2 = private constant [6 x i8] c"\74\68\72\65\65\00"
@.sl.str.3 = private constant [4 x i8] c"\6F\6E\65\00"
@.sl.str.4 = private constant [4 x i8] c"\74\77\6F\00"
@.sl.str.5 = private constant [6 x i8] c"\74\68\72\65\65\00"

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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.0, i32 0, i32 0), i64 3)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_pushint(i32 1)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.1, i32 0, i32 0), i64 3)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushint(i32 2)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.2, i32 0, i32 0), i64 5)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushint(i32 3)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_hashgen(i32 3)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_poplocal(i32 1)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i36
i36:
  br label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %ipfs39a
ipfs39a:
  %r39b = call i32 @hb_vmsh_pushnil()
  %c39b = icmp ne i32 %r39b, 0
  br i1 %c39b, label %epilogue, label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.3, i32 0, i32 0), i64 3)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_arraypush()
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.4, i32 0, i32 0), i64 3)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_arraypush()
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i60
i60:
  %r60 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %epilogue, label %i62
i62:
  %r62 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.5, i32 0, i32 0), i64 5)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i70
i70:
  %r70 = call i32 @hb_vmsh_arraypush()
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i71
i71:
  %r71 = call i32 @hb_vmsh_do(i32 3)
  %c71 = icmp ne i32 %r71, 0
  br i1 %c71, label %epilogue, label %i73
i73:
  br label %i76
i76:
  %r76 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c76 = icmp ne i32 %r76, 0
  br i1 %c76, label %epilogue, label %ipfs76a
ipfs76a:
  %r76b = call i32 @hb_vmsh_pushnil()
  %c76b = icmp ne i32 %r76b, 0
  br i1 %c76b, label %epilogue, label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %ipfs79a
ipfs79a:
  %r79b = call i32 @hb_vmsh_pushnil()
  %c79b = icmp ne i32 %r79b, 0
  br i1 %c79b, label %epilogue, label %i82
i82:
  %r82 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %epilogue, label %i84
i84:
  %r84 = call i32 @hb_vmsh_function(i32 1)
  %c84 = icmp ne i32 %r84, 0
  br i1 %c84, label %epilogue, label %i86
i86:
  %r86 = call i32 @hb_vmsh_do(i32 1)
  %c86 = icmp ne i32 %r86, 0
  br i1 %c86, label %epilogue, label %i88
i88:
  br label %i91
i91:
  %r91 = call i32 @hb_vmsh_pushnil()
  %c91 = icmp ne i32 %r91, 0
  br i1 %c91, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_retvalue()
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i93
i93:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([23 x i8], [23 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"

Program output

         1          2          3
         3

hello.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   ? "Hello world"
   return nil

LLVM IR (216 lines) download .ll

; 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"

Program output

Hello world

longlong.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   ? 5000000000
   return nil

LLVM IR (215 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/longlong.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_LONGLONG = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [23 x i8] c"\24\02\00\B0\02\00\80\00\F2\05\2A\01\00\00\00\14\01\24\03\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\4C\4F\4E\47\4C\4F\4E\47\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 [24 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\6C\6F\6E\67\6C\6F\6E\67\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_LONGLONG 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 }
]


define void @HB_FUN_LONGLONG() {
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_pushlonglong(i64 5000000000)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_do(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushnil()
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_retvalue()
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i22
i22:
  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([24 x i8], [24 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"

Program output

 5000000000

loop.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local i, nSum := 0
   for i := 1 to 10
      nSum := nSum + i
   next
   ? nSum
   return nil

LLVM IR (282 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/loop.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_LOOP = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [54 x i8] c"\0D\02\00\24\02\00\79\50\02\24\03\00\7A\A5\50\01\19\11\24\04\00\60\02\00\5F\01\87\24\03\00\AF\01\00\5C\0A\0F\1C\EE\24\06\00\B0\02\00\5F\02\14\01\24\07\00\64\6E\07"

@.sym.0 = private constant [5 x i8] c"\4C\4F\4F\50\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 [20 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\6C\6F\6F\70\2E\70\72\67\00"

@symbols_table = internal global [3 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_LOOP 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 }
]


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

define void @HB_FUN_MAIN() {
entry:
  %jp36 = alloca i32
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 0)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_poplocal(i32 2)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  br label %i12
i12:
  %r12 = call i32 @hb_vmsh_pushint(i32 1)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushunref()
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 1)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i33
i18:
  br label %i21
i21:
  %r21 = call i32 @hb_vmsh_pushlocalref(i32 2)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_pluseqpop()
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  br label %i30
i30:
  %r30 = call i32 @hb_vmsh_localincpush(i32 1)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_pushint(i32 10)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_greater()
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i36
i36:
  %rjp36 = call i32 @hb_vmsh_poplogical(i32* %jp36)
  %cjp36 = icmp ne i32 %rjp36, 0
  br i1 %cjp36, label %epilogue, label %jpdone36
jpdone36:
  %vjp36 = load i32, i32* %jp36
  %bjp36 = icmp ne i32 %vjp36, 0
  br i1 %bjp36, label %i38, label %i18
i38:
  br label %i41
i41:
  %r41 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([3 x %HB_SYMB], [3 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %epilogue, label %ipfs41a
ipfs41a:
  %r41b = call i32 @hb_vmsh_pushnil()
  %c41b = icmp ne i32 %r41b, 0
  br i1 %c41b, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_do(i32 1)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushnil()
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i52
i52:
  %r52 = call i32 @hb_vmsh_retvalue()
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i53
i53:
  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([20 x i8], [20 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"

Program output

        55

macro.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

//
// Group H corpus — macro opcodes straight-lined by the LLVM backend.
//
// One function per pcode opcode the Harbour compiler emits for macros. Each
// function uses the precise xBase form that triggers its target opcode:
//
//   MACROPUSH        x := &cName            (macro read into local)
//   MACROPOP         &cName := 99           (macro write)
//   MACROFUNC        Upper( &cArg )         (named call, macro in arglist)
//   MACROPUSHLIST    Upper( &cArg ), Show( &cArg )   (macro arg list — co-emitted w/ MACROFUNC and MACRODO)
//   MACRODO          Show( &cArg )          (statement-position named call w/ macro arg)
//   MACROTEXT        "hello, &cWhat"        (string literal w/ macro substitution)
//   MACROPUSHREF     TakeRef( @&cName )     (pass-by-reference macro)
//   MACROPUSHALIASED ? M->&cFld             (aliased memvar w/ macro field name)
//   MACROSEND        oErr:_Description( &cArg )    (macro arg in method call — obj:Meth(&x))
//   MACROPUSHPARE    x := ( &cExpr )               (macro in parenthesised expr list)
//   MACROPOPALIASED  M->&cFld := 42                (aliased memvar write with macro field)
//   MACROARRAYGEN    { &cParts }                   (macro-element array literal)
//   MACROPUSHINDEX   aArr[ &cIdx ]                 (macro array subscript index)
//   MACROSYMBOL      DO &cName                     (compile macro string to symbol name)
//
// Note: Harbour macros do NOT resolve LOCAL variables — every &-target is
// declared private (or memvar, for the aliased case).
//
function Main()
   local   cN := "nMain"
   private nMain := "ready"
   // direct macro op in Main so run.sh's HB_FUN_MAIN hard-fail check
   // catches a regression in any group-H shim — without this, Main()
   // contains no macros and the gate is vacuous.
   ? &cN
   ReadVar()
   WriteVar()
   CallFunc()
   DoFunc()
   TextSub()
   RefMacro()
   AliasMacro()
   SendMsg()
   PareSub()
   AliasWrite()
   ArrayGen()
   ArrayIndex()
   SymbolCall()
   return nil

function ReadVar()
   local   x
   local   cName := "n"
   private n     := 7
   // assignment form — `? &cName` would compile to MACROPUSHLIST+MACRODO, not MACROPUSH.
   x := &cName
   ? x
   return nil

function WriteVar()
   local   cName := "n"
   private n     := 0
   &cName := 99
   ? n
   return nil

function CallFunc()
   local cArg := "'hello'"
   ? Upper( &cArg )
   return nil

function DoFunc()
   local cArg := "'called'"
   Show( &cArg )
   return nil

function Show( cText )
   ? cText
   return nil

function TextSub()
   local   cStr
   private cWhat := "world"
   cStr := "hello, &cWhat"
   ? cStr
   return nil

function RefMacro()
   local   cName := "n"
   private n     := 0
   TakeRef( @&cName )
   ? n
   return nil

function TakeRef( xRef )
   xRef := 33
   return nil

function AliasMacro()
   local   cFld := "FOO"
   private FOO  := 99
   ? M->&cFld
   return nil

// MACROSEND — macro arg in a method call: oObj:Method( &cArg )
// The Error class _Description setter is called with a macro-expanded arg.
function SendMsg()
   local oErr := ErrorNew()
   local cArg := "'send-ok'"
   oErr:_Description( &cArg )
   ? oErr:Description()
   return nil

// MACROPUSHPARE — macro inside a parenthesized expression list: x := ( &cExpr )
function PareSub()
   local x
   local cExpr := "6 * 7"
   x := ( &cExpr )
   ? x
   return nil

// MACROPOPALIASED — aliased memvar write with macro field name: M->&cFld := value
function AliasWrite()
   local   cFld := "BAR"
   private BAR  := 0
   M->&cFld := 42
   ? BAR
   return nil

// MACROARRAYGEN — macro-element array literal: { &cParts }
function ArrayGen()
   local cParts := "11, 22, 33"
   local aArr   := { &cParts }
   ? aArr[ 1 ]
   return nil

// MACROPUSHINDEX — macro array subscript index: aArr[ &cIdx ]
function ArrayIndex()
   local aArr := { 10, 20, 30 }
   local cIdx  := "2"
   ? aArr[ &cIdx ]
   return nil

// MACROSYMBOL — compile macro string to symbol name: DO &cName
function SymbolCall()
   local cName := "SayHi"
   DO &cName
   return nil

function SayHi()
   ? "symbol-call"
   return nil

LLVM IR (1769 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/macro.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___MVPRIVATE()
declare void @HB_FUN_QOUT()
declare void @HB_FUN_UPPER()
declare void @HB_FUN_ERRORNEW()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_MACRO = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [160 x i8] c"\0D\01\00\24\1A\00\6A\06\6E\4D\61\69\6E\00\50\01\24\1B\00\6A\06\72\65\61\64\79\00\B0\03\00\6C\02\14\01\51\02\00\24\1F\00\B0\04\00\5F\01\2A\0B\7C\01\00\24\20\00\B0\05\00\14\00\24\21\00\B0\06\00\14\00\24\22\00\B0\07\00\14\00\24\23\00\B0\08\00\14\00\24\24\00\B0\09\00\14\00\24\25\00\B0\0A\00\14\00\24\26\00\B0\0B\00\14\00\24\27\00\B0\0C\00\14\00\24\28\00\B0\0D\00\14\00\24\29\00\B0\0E\00\14\00\24\2A\00\B0\0F\00\14\00\24\2B\00\B0\10\00\14\00\24\2C\00\B0\11\00\14\00\24\2D\00\64\6E\07"
@.pcode.HB_FUN_READVAR = internal constant [52 x i8] c"\0D\02\00\24\31\00\6A\02\6E\00\50\02\24\32\00\5C\07\B0\03\00\6C\12\14\01\51\12\00\24\34\00\5F\02\28\0B\50\01\24\35\00\B0\04\00\5F\01\14\01\24\36\00\64\6E\07"
@.pcode.HB_FUN_WRITEVAR = internal constant [52 x i8] c"\0D\01\00\24\39\00\6A\02\6E\00\50\01\24\3A\00\79\B0\03\00\6C\12\14\01\51\12\00\24\3B\00\5C\63\5F\01\26\0B\24\3C\00\B0\04\00\6D\12\00\14\01\24\3D\00\64\6E\07"
@.pcode.HB_FUN_CALLFUNC = internal constant [42 x i8] c"\0D\01\00\24\40\00\6A\08\27\68\65\6C\6C\6F\27\00\50\01\24\41\00\B0\04\00\B0\13\00\5F\01\2A\0B\7B\01\00\14\01\24\42\00\64\6E\07"
@.pcode.HB_FUN_DOFUNC = internal constant [38 x i8] c"\0D\01\00\24\45\00\6A\09\27\63\61\6C\6C\65\64\27\00\50\01\24\46\00\B0\14\00\5F\01\2A\0B\7C\01\00\24\47\00\64\6E\07"
@.pcode.HB_FUN_SHOW = internal constant [19 x i8] c"\0D\00\01\24\4A\00\B0\04\00\5F\01\14\01\24\4B\00\64\6E\07"
@.pcode.HB_FUN_TEXTSUB = internal constant [62 x i8] c"\0D\01\00\24\4F\00\6A\06\77\6F\72\6C\64\00\B0\03\00\6C\15\14\01\51\15\00\24\50\00\6A\0E\68\65\6C\6C\6F\2C\20\26\63\57\68\61\74\00\2F\50\01\24\51\00\B0\04\00\5F\01\14\01\24\52\00\64\6E\07"
@.pcode.HB_FUN_REFMACRO = internal constant [54 x i8] c"\0D\01\00\24\55\00\6A\02\6E\00\50\01\24\56\00\79\B0\03\00\6C\12\14\01\51\12\00\24\57\00\B0\16\00\5F\01\7F\14\01\24\58\00\B0\04\00\6D\12\00\14\01\24\59\00\64\6E\07"
@.pcode.HB_FUN_TAKEREF = internal constant [16 x i8] c"\0D\00\01\24\5C\00\5C\21\50\01\24\5D\00\64\6E\07"
@.pcode.HB_FUN_ALIASMACRO = internal constant [51 x i8] c"\0D\01\00\24\60\00\6A\04\46\4F\4F\00\50\01\24\61\00\5C\63\B0\03\00\6C\17\14\01\51\17\00\24\62\00\B0\04\00\6A\02\4D\00\5F\01\2D\0B\14\01\24\63\00\64\6E\07"
@.pcode.HB_FUN_SENDMSG = internal constant [67 x i8] c"\0D\02\00\24\68\00\B0\18\00\0C\00\50\01\24\69\00\6A\0A\27\73\65\6E\64\2D\6F\6B\27\00\50\02\24\6A\00\30\19\00\5F\01\5F\02\2A\0B\92\01\00\49\24\6B\00\B0\04\00\30\1A\00\5F\01\70\00\14\01\24\6C\00\64\6E\07"
@.pcode.HB_FUN_PARESUB = internal constant [41 x i8] c"\0D\02\00\24\71\00\6A\06\36\20\2A\20\37\00\50\02\24\72\00\5F\02\2C\0B\50\01\24\73\00\B0\04\00\5F\01\14\01\24\74\00\64\6E\07"
@.pcode.HB_FUN_ALIASWRITE = internal constant [58 x i8] c"\0D\01\00\24\78\00\6A\04\42\41\52\00\50\01\24\79\00\79\B0\03\00\6C\1B\14\01\51\1B\00\24\7A\00\5C\2A\6A\02\4D\00\5F\01\27\0B\24\7B\00\B0\04\00\6D\1B\00\14\01\24\7C\00\64\6E\07"
@.pcode.HB_FUN_ARRAYGEN = internal constant [51 x i8] c"\0D\02\00\24\80\00\6A\0B\31\31\2C\20\32\32\2C\20\33\33\00\50\01\24\81\00\5F\01\2A\0B\29\01\00\50\02\24\82\00\B0\04\00\5F\02\7A\01\14\01\24\83\00\64\6E\07"
@.pcode.HB_FUN_ARRAYINDEX = internal constant [48 x i8] c"\0D\02\00\24\87\00\5C\0A\5C\14\5C\1E\04\03\00\50\01\24\88\00\6A\02\32\00\50\02\24\89\00\B0\04\00\5F\01\5F\02\2A\0B\2B\01\14\01\24\8A\00\64\6E\07"
@.pcode.HB_FUN_SYMBOLCALL = internal constant [31 x i8] c"\0D\01\00\24\8E\00\6A\06\53\61\79\48\69\00\50\01\24\8F\00\5F\01\2E\64\14\00\24\90\00\64\6E\07"
@.pcode.HB_FUN_SAYHI = internal constant [28 x i8] c"\24\93\00\B0\04\00\6A\0C\73\79\6D\62\6F\6C\2D\63\61\6C\6C\00\14\01\24\94\00\64\6E\07"

@.sym.0 = private constant [6 x i8] c"\4D\41\43\52\4F\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [6 x i8] c"\4E\4D\41\49\4E\00"
@.sym.3 = private constant [12 x i8] c"\5F\5F\4D\56\50\52\49\56\41\54\45\00"
@.sym.4 = private constant [5 x i8] c"\51\4F\55\54\00"
@.sym.5 = private constant [8 x i8] c"\52\45\41\44\56\41\52\00"
@.sym.6 = private constant [9 x i8] c"\57\52\49\54\45\56\41\52\00"
@.sym.7 = private constant [9 x i8] c"\43\41\4C\4C\46\55\4E\43\00"
@.sym.8 = private constant [7 x i8] c"\44\4F\46\55\4E\43\00"
@.sym.9 = private constant [8 x i8] c"\54\45\58\54\53\55\42\00"
@.sym.10 = private constant [9 x i8] c"\52\45\46\4D\41\43\52\4F\00"
@.sym.11 = private constant [11 x i8] c"\41\4C\49\41\53\4D\41\43\52\4F\00"
@.sym.12 = private constant [8 x i8] c"\53\45\4E\44\4D\53\47\00"
@.sym.13 = private constant [8 x i8] c"\50\41\52\45\53\55\42\00"
@.sym.14 = private constant [11 x i8] c"\41\4C\49\41\53\57\52\49\54\45\00"
@.sym.15 = private constant [9 x i8] c"\41\52\52\41\59\47\45\4E\00"
@.sym.16 = private constant [11 x i8] c"\41\52\52\41\59\49\4E\44\45\58\00"
@.sym.17 = private constant [11 x i8] c"\53\59\4D\42\4F\4C\43\41\4C\4C\00"
@.sym.18 = private constant [2 x i8] c"\4E\00"
@.sym.19 = private constant [6 x i8] c"\55\50\50\45\52\00"
@.sym.20 = private constant [5 x i8] c"\53\48\4F\57\00"
@.sym.21 = private constant [6 x i8] c"\43\57\48\41\54\00"
@.sym.22 = private constant [8 x i8] c"\54\41\4B\45\52\45\46\00"
@.sym.23 = private constant [4 x i8] c"\46\4F\4F\00"
@.sym.24 = private constant [9 x i8] c"\45\52\52\4F\52\4E\45\57\00"
@.sym.25 = private constant [13 x i8] c"\5F\44\45\53\43\52\49\50\54\49\4F\4E\00"
@.sym.26 = private constant [12 x i8] c"\44\45\53\43\52\49\50\54\49\4F\4E\00"
@.sym.27 = private constant [4 x i8] c"\42\41\52\00"
@.sym.28 = private constant [6 x i8] c"\53\41\59\48\49\00"

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

@symbols_table = internal global [29 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_MACRO 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([6 x i8], [6 x i8]* @.sym.2, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN___MVPRIVATE to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.4, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.5, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_READVAR to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.6, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_WRITEVAR to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.7, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_CALLFUNC to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([7 x i8], [7 x i8]* @.sym.8, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_DOFUNC to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.9, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TEXTSUB to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.10, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_REFMACRO to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.11, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_ALIASMACRO to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.12, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_SENDMSG to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.13, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_PARESUB to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.14, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_ALIASWRITE to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.15, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_ARRAYGEN to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.16, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_ARRAYINDEX to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.17, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_SYMBOLCALL to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([2 x i8], [2 x i8]* @.sym.18, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.19, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_UPPER to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.20, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_SHOW to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.21, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.22, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TAKEREF to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.23, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.24, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_ERRORNEW to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([13 x i8], [13 x i8]* @.sym.25, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.26, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.27, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.28, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_SAYHI to i8*),
           i8* null }
]

@.sl.str.0 = private constant [6 x i8] c"\6E\4D\61\69\6E\00"
@.sl.str.1 = private constant [6 x i8] c"\72\65\61\64\79\00"
@.sl.str.2 = private constant [2 x i8] c"\6E\00"
@.sl.str.3 = private constant [2 x i8] c"\6E\00"
@.sl.str.4 = private constant [8 x i8] c"\27\68\65\6C\6C\6F\27\00"
@.sl.str.5 = private constant [9 x i8] c"\27\63\61\6C\6C\65\64\27\00"
@.sl.str.6 = private constant [6 x i8] c"\77\6F\72\6C\64\00"
@.sl.str.7 = private constant [14 x i8] c"\68\65\6C\6C\6F\2C\20\26\63\57\68\61\74\00"
@.sl.str.8 = private constant [2 x i8] c"\6E\00"
@.sl.str.9 = private constant [4 x i8] c"\46\4F\4F\00"
@.sl.str.10 = private constant [2 x i8] c"\4D\00"
@.sl.str.11 = private constant [10 x i8] c"\27\73\65\6E\64\2D\6F\6B\27\00"
@.sl.str.12 = private constant [6 x i8] c"\36\20\2A\20\37\00"
@.sl.str.13 = private constant [4 x i8] c"\42\41\52\00"
@.sl.str.14 = private constant [2 x i8] c"\4D\00"
@.sl.str.15 = private constant [11 x i8] c"\31\31\2C\20\32\32\2C\20\33\33\00"
@.sl.str.16 = private constant [2 x i8] c"\32\00"
@.sl.str.17 = private constant [6 x i8] c"\53\61\79\48\69\00"
@.sl.str.18 = private constant [12 x i8] c"\73\79\6D\62\6F\6C\2D\63\61\6C\6C\00"

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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.0, i32 0, i32 0), i64 5)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 1)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.1, i32 0, i32 0), i64 5)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %ipfs27a
ipfs27a:
  %r27b = call i32 @hb_vmsh_pushnil()
  %c27b = icmp ne i32 %r27b, 0
  br i1 %c27b, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_do(i32 1)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i37
i37:
  br label %i40
i40:
  %r40 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %ipfs40a
ipfs40a:
  %r40b = call i32 @hb_vmsh_pushnil()
  %c40b = icmp ne i32 %r40b, 0
  br i1 %c40b, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_macropushlist(i32 11)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_macrodo(i32 1)
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i50
i50:
  br label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %ipfs53a
ipfs53a:
  %r53b = call i32 @hb_vmsh_pushnil()
  %c53b = icmp ne i32 %r53b, 0
  br i1 %c53b, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_do(i32 0)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i58
i58:
  br label %i61
i61:
  %r61 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c61 = icmp ne i32 %r61, 0
  br i1 %c61, label %epilogue, label %ipfs61a
ipfs61a:
  %r61b = call i32 @hb_vmsh_pushnil()
  %c61b = icmp ne i32 %r61b, 0
  br i1 %c61b, label %epilogue, label %i64
i64:
  %r64 = call i32 @hb_vmsh_do(i32 0)
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i66
i66:
  br label %i69
i69:
  %r69 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c69 = icmp ne i32 %r69, 0
  br i1 %c69, label %epilogue, label %ipfs69a
ipfs69a:
  %r69b = call i32 @hb_vmsh_pushnil()
  %c69b = icmp ne i32 %r69b, 0
  br i1 %c69b, label %epilogue, label %i72
i72:
  %r72 = call i32 @hb_vmsh_do(i32 0)
  %c72 = icmp ne i32 %r72, 0
  br i1 %c72, label %epilogue, label %i74
i74:
  br label %i77
i77:
  %r77 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 8))
  %c77 = icmp ne i32 %r77, 0
  br i1 %c77, label %epilogue, label %ipfs77a
ipfs77a:
  %r77b = call i32 @hb_vmsh_pushnil()
  %c77b = icmp ne i32 %r77b, 0
  br i1 %c77b, label %epilogue, label %i80
i80:
  %r80 = call i32 @hb_vmsh_do(i32 0)
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i82
i82:
  br label %i85
i85:
  %r85 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c85 = icmp ne i32 %r85, 0
  br i1 %c85, label %epilogue, label %ipfs85a
ipfs85a:
  %r85b = call i32 @hb_vmsh_pushnil()
  %c85b = icmp ne i32 %r85b, 0
  br i1 %c85b, label %epilogue, label %i88
i88:
  %r88 = call i32 @hb_vmsh_do(i32 0)
  %c88 = icmp ne i32 %r88, 0
  br i1 %c88, label %epilogue, label %i90
i90:
  br label %i93
i93:
  %r93 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c93 = icmp ne i32 %r93, 0
  br i1 %c93, label %epilogue, label %ipfs93a
ipfs93a:
  %r93b = call i32 @hb_vmsh_pushnil()
  %c93b = icmp ne i32 %r93b, 0
  br i1 %c93b, label %epilogue, label %i96
i96:
  %r96 = call i32 @hb_vmsh_do(i32 0)
  %c96 = icmp ne i32 %r96, 0
  br i1 %c96, label %epilogue, label %i98
i98:
  br label %i101
i101:
  %r101 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 11))
  %c101 = icmp ne i32 %r101, 0
  br i1 %c101, label %epilogue, label %ipfs101a
ipfs101a:
  %r101b = call i32 @hb_vmsh_pushnil()
  %c101b = icmp ne i32 %r101b, 0
  br i1 %c101b, label %epilogue, label %i104
i104:
  %r104 = call i32 @hb_vmsh_do(i32 0)
  %c104 = icmp ne i32 %r104, 0
  br i1 %c104, label %epilogue, label %i106
i106:
  br label %i109
i109:
  %r109 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 12))
  %c109 = icmp ne i32 %r109, 0
  br i1 %c109, label %epilogue, label %ipfs109a
ipfs109a:
  %r109b = call i32 @hb_vmsh_pushnil()
  %c109b = icmp ne i32 %r109b, 0
  br i1 %c109b, label %epilogue, label %i112
i112:
  %r112 = call i32 @hb_vmsh_do(i32 0)
  %c112 = icmp ne i32 %r112, 0
  br i1 %c112, label %epilogue, label %i114
i114:
  br label %i117
i117:
  %r117 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 13))
  %c117 = icmp ne i32 %r117, 0
  br i1 %c117, label %epilogue, label %ipfs117a
ipfs117a:
  %r117b = call i32 @hb_vmsh_pushnil()
  %c117b = icmp ne i32 %r117b, 0
  br i1 %c117b, label %epilogue, label %i120
i120:
  %r120 = call i32 @hb_vmsh_do(i32 0)
  %c120 = icmp ne i32 %r120, 0
  br i1 %c120, label %epilogue, label %i122
i122:
  br label %i125
i125:
  %r125 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 14))
  %c125 = icmp ne i32 %r125, 0
  br i1 %c125, label %epilogue, label %ipfs125a
ipfs125a:
  %r125b = call i32 @hb_vmsh_pushnil()
  %c125b = icmp ne i32 %r125b, 0
  br i1 %c125b, label %epilogue, label %i128
i128:
  %r128 = call i32 @hb_vmsh_do(i32 0)
  %c128 = icmp ne i32 %r128, 0
  br i1 %c128, label %epilogue, label %i130
i130:
  br label %i133
i133:
  %r133 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 15))
  %c133 = icmp ne i32 %r133, 0
  br i1 %c133, label %epilogue, label %ipfs133a
ipfs133a:
  %r133b = call i32 @hb_vmsh_pushnil()
  %c133b = icmp ne i32 %r133b, 0
  br i1 %c133b, label %epilogue, label %i136
i136:
  %r136 = call i32 @hb_vmsh_do(i32 0)
  %c136 = icmp ne i32 %r136, 0
  br i1 %c136, label %epilogue, label %i138
i138:
  br label %i141
i141:
  %r141 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 16))
  %c141 = icmp ne i32 %r141, 0
  br i1 %c141, label %epilogue, label %ipfs141a
ipfs141a:
  %r141b = call i32 @hb_vmsh_pushnil()
  %c141b = icmp ne i32 %r141b, 0
  br i1 %c141b, label %epilogue, label %i144
i144:
  %r144 = call i32 @hb_vmsh_do(i32 0)
  %c144 = icmp ne i32 %r144, 0
  br i1 %c144, label %epilogue, label %i146
i146:
  br label %i149
i149:
  %r149 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 17))
  %c149 = icmp ne i32 %r149, 0
  br i1 %c149, label %epilogue, label %ipfs149a
ipfs149a:
  %r149b = call i32 @hb_vmsh_pushnil()
  %c149b = icmp ne i32 %r149b, 0
  br i1 %c149b, label %epilogue, label %i152
i152:
  %r152 = call i32 @hb_vmsh_do(i32 0)
  %c152 = icmp ne i32 %r152, 0
  br i1 %c152, label %epilogue, label %i154
i154:
  br label %i157
i157:
  %r157 = call i32 @hb_vmsh_pushnil()
  %c157 = icmp ne i32 %r157, 0
  br i1 %c157, label %epilogue, label %i158
i158:
  %r158 = call i32 @hb_vmsh_retvalue()
  %c158 = icmp ne i32 %r158, 0
  br i1 %c158, label %epilogue, label %i159
i159:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_READVAR() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.2, i32 0, i32 0), i64 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_poplocal(i32 2)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  br label %i15
i15:
  %r15 = call i32 @hb_vmsh_pushint(i32 7)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %ipfs17a
ipfs17a:
  %r17b = call i32 @hb_vmsh_pushnil()
  %c17b = icmp ne i32 %r17b, 0
  br i1 %c17b, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_do(i32 1)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i27
i27:
  br label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_macropush(i32 11)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_poplocal(i32 1)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i36
i36:
  br label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %ipfs39a
ipfs39a:
  %r39b = call i32 @hb_vmsh_pushnil()
  %c39b = icmp ne i32 %r39b, 0
  br i1 %c39b, label %epilogue, label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_do(i32 1)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i46
i46:
  br label %i49
i49:
  %r49 = call i32 @hb_vmsh_pushnil()
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_retvalue()
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_WRITEVAR() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.3, i32 0, i32 0), i64 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_poplocal(i32 1)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  br label %i15
i15:
  %r15 = call i32 @hb_vmsh_pushint(i32 0)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i16
i16:
  %r16 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %ipfs16a
ipfs16a:
  %r16b = call i32 @hb_vmsh_pushnil()
  %c16b = icmp ne i32 %r16b, 0
  br i1 %c16b, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_do(i32 1)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i26
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushint(i32 99)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_macropop(i32 11)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  br label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %ipfs38a
ipfs38a:
  %r38b = call i32 @hb_vmsh_pushnil()
  %c38b = icmp ne i32 %r38b, 0
  br i1 %c38b, label %epilogue, label %i41
i41:
  %r41 = call i32 @hb_vmsh_pushvariable(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_do(i32 1)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i46
i46:
  br label %i49
i49:
  %r49 = call i32 @hb_vmsh_pushnil()
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_retvalue()
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i51
i51:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_CALLFUNC() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([8 x i8], [8 x i8]* @.sl.str.4, i32 0, i32 0), i64 7)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i16
i16:
  %r16 = call i32 @hb_vmsh_poplocal(i32 1)
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %i18
i18:
  br label %i21
i21:
  %r21 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %ipfs21a
ipfs21a:
  %r21b = call i32 @hb_vmsh_pushnil()
  %c21b = icmp ne i32 %r21b, 0
  br i1 %c21b, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 19))
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %ipfs24a
ipfs24a:
  %r24b = call i32 @hb_vmsh_pushnil()
  %c24b = icmp ne i32 %r24b, 0
  br i1 %c24b, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_macropushlist(i32 11)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_macrofunc(i32 1)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_do(i32 1)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i36
i36:
  br label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushnil()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_retvalue()
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i41
i41:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_DOFUNC() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([9 x i8], [9 x i8]* @.sl.str.5, i32 0, i32 0), i64 8)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i17
i17:
  %r17 = call i32 @hb_vmsh_poplocal(i32 1)
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %i19
i19:
  br label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 20))
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %ipfs22a
ipfs22a:
  %r22b = call i32 @hb_vmsh_pushnil()
  %c22b = icmp ne i32 %r22b, 0
  br i1 %c22b, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_macropushlist(i32 11)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_macrodo(i32 1)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i32
i32:
  br label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushnil()
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_retvalue()
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i37
i37:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_SHOW() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %ipfs6a
ipfs6a:
  %r6b = call i32 @hb_vmsh_pushnil()
  %c6b = icmp ne i32 %r6b, 0
  br i1 %c6b, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_do(i32 1)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  br label %i16
i16:
  %r16 = call i32 @hb_vmsh_pushnil()
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %i17
i17:
  %r17 = call i32 @hb_vmsh_retvalue()
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %i18
i18:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TEXTSUB() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.6, i32 0, i32 0), i64 5)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %ipfs14a
ipfs14a:
  %r14b = call i32 @hb_vmsh_pushnil()
  %c14b = icmp ne i32 %r14b, 0
  br i1 %c14b, label %epilogue, label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 21))
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_do(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 21))
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i24
i24:
  br label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushstring(i8* getelementptr([14 x i8], [14 x i8]* @.sl.str.7, i32 0, i32 0), i64 13)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_macrotext()
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_poplocal(i32 1)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i46
i46:
  br label %i49
i49:
  %r49 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %ipfs49a
ipfs49a:
  %r49b = call i32 @hb_vmsh_pushnil()
  %c49b = icmp ne i32 %r49b, 0
  br i1 %c49b, label %epilogue, label %i52
i52:
  %r52 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i54
i54:
  %r54 = call i32 @hb_vmsh_do(i32 1)
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %i56
i56:
  br label %i59
i59:
  %r59 = call i32 @hb_vmsh_pushnil()
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i60
i60:
  %r60 = call i32 @hb_vmsh_retvalue()
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %epilogue, label %i61
i61:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_REFMACRO() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.8, i32 0, i32 0), i64 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_poplocal(i32 1)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  br label %i15
i15:
  %r15 = call i32 @hb_vmsh_pushint(i32 0)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i16
i16:
  %r16 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %ipfs16a
ipfs16a:
  %r16b = call i32 @hb_vmsh_pushnil()
  %c16b = icmp ne i32 %r16b, 0
  br i1 %c16b, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_do(i32 1)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i26
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 22))
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %ipfs29a
ipfs29a:
  %r29b = call i32 @hb_vmsh_pushnil()
  %c29b = icmp ne i32 %r29b, 0
  br i1 %c29b, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_macropushref()
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_do(i32 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i37
i37:
  br label %i40
i40:
  %r40 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %ipfs40a
ipfs40a:
  %r40b = call i32 @hb_vmsh_pushnil()
  %c40b = icmp ne i32 %r40b, 0
  br i1 %c40b, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushvariable(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 18))
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_do(i32 1)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushnil()
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i52
i52:
  %r52 = call i32 @hb_vmsh_retvalue()
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i53
i53:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TAKEREF() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 33)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_poplocal(i32 1)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  br label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushnil()
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_retvalue()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_ALIASMACRO() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.9, i32 0, i32 0), i64 3)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_poplocal(i32 1)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  br label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushint(i32 99)
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %ipfs19a
ipfs19a:
  %r19b = call i32 @hb_vmsh_pushnil()
  %c19b = icmp ne i32 %r19b, 0
  br i1 %c19b, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 23))
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_do(i32 1)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 23))
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i29
i29:
  br label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %ipfs32a
ipfs32a:
  %r32b = call i32 @hb_vmsh_pushnil()
  %c32b = icmp ne i32 %r32b, 0
  br i1 %c32b, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.10, i32 0, i32 0), i64 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i41
i41:
  %r41 = call i32 @hb_vmsh_macropushaliased(i32 11)
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_do(i32 1)
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i45
i45:
  br label %i48
i48:
  %r48 = call i32 @hb_vmsh_pushnil()
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i49
i49:
  %r49 = call i32 @hb_vmsh_retvalue()
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i50
i50:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_SENDMSG() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 24))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %ipfs6a
ipfs6a:
  %r6b = call i32 @hb_vmsh_pushnil()
  %c6b = icmp ne i32 %r6b, 0
  br i1 %c6b, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_function(i32 0)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_poplocal(i32 1)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  br label %i16
i16:
  %r16 = call i32 @hb_vmsh_pushstring(i8* getelementptr([10 x i8], [10 x i8]* @.sl.str.11, i32 0, i32 0), i64 9)
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_poplocal(i32 2)
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i30
i30:
  br label %i33
i33:
  %r33 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 25))
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_macropushlist(i32 11)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  %r42 = call i32 @hb_vmsh_macrosend(i32 1)
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_pop()
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i46
i46:
  br label %i49
i49:
  %r49 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %ipfs49a
ipfs49a:
  %r49b = call i32 @hb_vmsh_pushnil()
  %c49b = icmp ne i32 %r49b, 0
  br i1 %c49b, label %epilogue, label %i52
i52:
  %r52 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 26))
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i57
i57:
  %r57 = call i32 @hb_vmsh_send(i32 0)
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_do(i32 1)
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i61
i61:
  br label %i64
i64:
  %r64 = call i32 @hb_vmsh_pushnil()
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i65
i65:
  %r65 = call i32 @hb_vmsh_retvalue()
  %c65 = icmp ne i32 %r65, 0
  br i1 %c65, label %epilogue, label %i66
i66:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_PARESUB() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.12, i32 0, i32 0), i64 5)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 2)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_macropushpare(i32 11)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_poplocal(i32 1)
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i25
i25:
  br label %i28
i28:
  %r28 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %ipfs28a
ipfs28a:
  %r28b = call i32 @hb_vmsh_pushnil()
  %c28b = icmp ne i32 %r28b, 0
  br i1 %c28b, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_do(i32 1)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  br label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushnil()
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_retvalue()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_ALIASWRITE() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.13, i32 0, i32 0), i64 3)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_poplocal(i32 1)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  br label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushint(i32 0)
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %i18
i18:
  %r18 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %ipfs18a
ipfs18a:
  %r18b = call i32 @hb_vmsh_pushnil()
  %c18b = icmp ne i32 %r18b, 0
  br i1 %c18b, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 27))
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_do(i32 1)
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i25
i25:
  %r25 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 27))
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i28
i28:
  br label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushint(i32 42)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.14, i32 0, i32 0), i64 1)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_macropopaliased(i32 11)
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i41
i41:
  br label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %ipfs44a
ipfs44a:
  %r44b = call i32 @hb_vmsh_pushnil()
  %c44b = icmp ne i32 %r44b, 0
  br i1 %c44b, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_pushvariable(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 27))
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_do(i32 1)
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i52
i52:
  br label %i55
i55:
  %r55 = call i32 @hb_vmsh_pushnil()
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i56
i56:
  %r56 = call i32 @hb_vmsh_retvalue()
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i57
i57:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_ARRAYGEN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([11 x i8], [11 x i8]* @.sl.str.15, i32 0, i32 0), i64 10)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_poplocal(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  br label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_macropushlist(i32 11)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_macroarraygen(i32 1)
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_poplocal(i32 2)
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i33
i33:
  br label %i36
i36:
  %r36 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %ipfs36a
ipfs36a:
  %r36b = call i32 @hb_vmsh_pushnil()
  %c36b = icmp ne i32 %r36b, 0
  br i1 %c36b, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i41
i41:
  %r41 = call i32 @hb_vmsh_pushint(i32 1)
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %epilogue, label %i42
i42:
  %r42 = call i32 @hb_vmsh_arraypush()
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_do(i32 1)
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i45
i45:
  br label %i48
i48:
  %r48 = call i32 @hb_vmsh_pushnil()
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i49
i49:
  %r49 = call i32 @hb_vmsh_retvalue()
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i50
i50:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_ARRAYINDEX() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 2, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 10)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  %r8 = call i32 @hb_vmsh_pushint(i32 20)
  %c8 = icmp ne i32 %r8, 0
  br i1 %c8, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushint(i32 30)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_arraygen(i32 3)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_poplocal(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.16, i32 0, i32 0), i64 1)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_poplocal(i32 2)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %ipfs29a
ipfs29a:
  %r29b = call i32 @hb_vmsh_pushnil()
  %c29b = icmp ne i32 %r29b, 0
  br i1 %c29b, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_macropushlist(i32 11)
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_macropushindex()
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_arraypush()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_do(i32 1)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushnil()
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_retvalue()
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i47
i47:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_SYMBOLCALL() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushstring(i8* getelementptr([6 x i8], [6 x i8]* @.sl.str.17, i32 0, i32 0), i64 5)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 1)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_macrosymbol()
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushnil()
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_do(i32 0)
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i25
i25:
  br label %i28
i28:
  %r28 = call i32 @hb_vmsh_pushnil()
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_retvalue()
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i30
i30:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_SAYHI() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %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.18, 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([29 x %HB_SYMB], [29 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 29,
    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"

Program output

ready
         7
        99
HELLO
called
hello, world
        33
        99
send-ok
        42
        42
        11
        20
symbol-call

memvar.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   private pCount := 0
   pCount := pCount + 5
   pCount := pCount * 3
   ? pCount
   return nil

LLVM IR (288 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/memvar.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___MVPRIVATE()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_MEMVAR = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [55 x i8] c"\24\02\00\79\B0\03\00\6C\02\14\01\51\02\00\24\03\00\6D\02\00\5C\05\48\53\02\00\24\04\00\6D\02\00\5C\03\41\53\02\00\24\05\00\B0\04\00\6D\02\00\14\01\24\06\00\64\6E\07"

@.sym.0 = private constant [7 x i8] c"\4D\45\4D\56\41\52\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [7 x i8] c"\50\43\4F\55\4E\54\00"
@.sym.3 = private constant [12 x i8] c"\5F\5F\4D\56\50\52\49\56\41\54\45\00"
@.sym.4 = private constant [5 x i8] c"\51\4F\55\54\00"

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

@symbols_table = internal global [5 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([7 x i8], [7 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_MEMVAR 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([7 x i8], [7 x i8]* @.sym.2, i32 0, i32 0),
           i64 129,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN___MVPRIVATE to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.4, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]


define void @HB_FUN_MEMVAR() {
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_pushint(i32 0)
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i4
i4:
  %r4 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c4 = icmp ne i32 %r4, 0
  br i1 %c4, label %epilogue, label %ipfs4a
ipfs4a:
  %r4b = call i32 @hb_vmsh_pushnil()
  %c4b = icmp ne i32 %r4b, 0
  br i1 %c4b, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_do(i32 1)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_popmemvar(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i14
i14:
  br label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushvariable(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushint(i32 5)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_plus()
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_popvariable(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %i26
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushvariable(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushint(i32 3)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_mult()
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_popvariable(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i38
i38:
  br label %i41
i41:
  %r41 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %epilogue, label %ipfs41a
ipfs41a:
  %r41b = call i32 @hb_vmsh_pushnil()
  %c41b = icmp ne i32 %r41b, 0
  br i1 %c41b, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushvariable(%HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_do(i32 1)
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i49
i49:
  br label %i52
i52:
  %r52 = call i32 @hb_vmsh_pushnil()
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_retvalue()
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i54
i54:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([5 x %HB_SYMB], [5 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 5,
    i8* getelementptr([22 x i8], [22 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"

Program output

        15

oop.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

function Main()
   local oErr := ErrorNew()
   oErr:description := "disk full"
   oErr:subcode := 42
   ? oErr:description
   ? oErr:subcode
   ? UseObj( oErr )
   return nil

function UseObj( o )
   return o:subcode + 1

LLVM IR (417 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/oop.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_ERRORNEW()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_OOP = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [100 x i8] c"\0D\01\00\24\02\00\B0\02\00\0C\00\50\01\24\03\00\30\03\00\5F\01\6A\0A\64\69\73\6B\20\66\75\6C\6C\00\70\01\49\24\04\00\30\04\00\5F\01\5C\2A\70\01\49\24\05\00\B0\05\00\30\06\00\5F\01\70\00\14\01\24\06\00\B0\05\00\30\07\00\5F\01\70\00\14\01\24\07\00\B0\05\00\B0\08\00\5F\01\0C\01\14\01\24\08\00\64\6E\07"
@.pcode.HB_FUN_USEOBJ = internal constant [17 x i8] c"\0D\00\01\24\0B\00\30\07\00\5F\01\70\00\7A\48\6E\07"

@.sym.0 = private constant [4 x i8] c"\4F\4F\50\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [9 x i8] c"\45\52\52\4F\52\4E\45\57\00"
@.sym.3 = private constant [13 x i8] c"\5F\44\45\53\43\52\49\50\54\49\4F\4E\00"
@.sym.4 = private constant [9 x i8] c"\5F\53\55\42\43\4F\44\45\00"
@.sym.5 = private constant [5 x i8] c"\51\4F\55\54\00"
@.sym.6 = private constant [12 x i8] c"\44\45\53\43\52\49\50\54\49\4F\4E\00"
@.sym.7 = private constant [8 x i8] c"\53\55\42\43\4F\44\45\00"
@.sym.8 = private constant [7 x i8] c"\55\53\45\4F\42\4A\00"

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

@symbols_table = internal global [9 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_OOP 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([9 x i8], [9 x i8]* @.sym.2, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_ERRORNEW to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([13 x i8], [13 x i8]* @.sym.3, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.4, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.5, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.6, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.7, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([7 x i8], [7 x i8]* @.sym.8, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_USEOBJ to i8*),
           i8* null }
]

@.sl.str.0 = private constant [10 x i8] c"\64\69\73\6B\20\66\75\6C\6C\00"

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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %ipfs6a
ipfs6a:
  %r6b = call i32 @hb_vmsh_pushnil()
  %c6b = icmp ne i32 %r6b, 0
  br i1 %c6b, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_function(i32 0)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_poplocal(i32 1)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  br label %i16
i16:
  %r16 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_pushstring(i8* getelementptr([10 x i8], [10 x i8]* @.sl.str.0, i32 0, i32 0), i64 9)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_send(i32 1)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pop()
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i36
i36:
  br label %i39
i39:
  %r39 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %epilogue, label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushint(i32 42)
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_send(i32 1)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  %r48 = call i32 @hb_vmsh_pop()
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i49
i49:
  br label %i52
i52:
  %r52 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %epilogue, label %ipfs52a
ipfs52a:
  %r52b = call i32 @hb_vmsh_pushnil()
  %c52b = icmp ne i32 %r52b, 0
  br i1 %c52b, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i60
i60:
  %r60 = call i32 @hb_vmsh_send(i32 0)
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %epilogue, label %i62
i62:
  %r62 = call i32 @hb_vmsh_do(i32 1)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i64
i64:
  br label %i67
i67:
  %r67 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c67 = icmp ne i32 %r67, 0
  br i1 %c67, label %epilogue, label %ipfs67a
ipfs67a:
  %r67b = call i32 @hb_vmsh_pushnil()
  %c67b = icmp ne i32 %r67b, 0
  br i1 %c67b, label %epilogue, label %i70
i70:
  %r70 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %epilogue, label %i73
i73:
  %r73 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %epilogue, label %i75
i75:
  %r75 = call i32 @hb_vmsh_send(i32 0)
  %c75 = icmp ne i32 %r75, 0
  br i1 %c75, label %epilogue, label %i77
i77:
  %r77 = call i32 @hb_vmsh_do(i32 1)
  %c77 = icmp ne i32 %r77, 0
  br i1 %c77, label %epilogue, label %i79
i79:
  br label %i82
i82:
  %r82 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %epilogue, label %ipfs82a
ipfs82a:
  %r82b = call i32 @hb_vmsh_pushnil()
  %c82b = icmp ne i32 %r82b, 0
  br i1 %c82b, label %epilogue, label %i85
i85:
  %r85 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 8))
  %c85 = icmp ne i32 %r85, 0
  br i1 %c85, label %epilogue, label %ipfs85a
ipfs85a:
  %r85b = call i32 @hb_vmsh_pushnil()
  %c85b = icmp ne i32 %r85b, 0
  br i1 %c85b, label %epilogue, label %i88
i88:
  %r88 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c88 = icmp ne i32 %r88, 0
  br i1 %c88, label %epilogue, label %i90
i90:
  %r90 = call i32 @hb_vmsh_function(i32 1)
  %c90 = icmp ne i32 %r90, 0
  br i1 %c90, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_do(i32 1)
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i94
i94:
  br label %i97
i97:
  %r97 = call i32 @hb_vmsh_pushnil()
  %c97 = icmp ne i32 %r97, 0
  br i1 %c97, label %epilogue, label %i98
i98:
  %r98 = call i32 @hb_vmsh_retvalue()
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i99
i99:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_USEOBJ() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_send(i32 0)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushint(i32 1)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_plus()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_retvalue()
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i16
i16:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([9 x %HB_SYMB], [9 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 9,
    i8* getelementptr([19 x i8], [19 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"

Program output

disk full
        42
        43

oopclass.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

#include "hbclass.ch"

function Main()
   local oPt := Point():New( 3, 4 )
   oPt:Move( 10, 20 )
   ? oPt:X, oPt:Y
   with object oPt
      :Move( 1, 1 )
      ? :X, :Y
   end
   return nil

CREATE CLASS Point
   VAR X
   VAR Y
   METHOD New( nX, nY )
   METHOD Move( dX, dY )
ENDCLASS

METHOD New( nX, nY ) CLASS Point
   ::X := nX
   ::Y := nY
   return Self

METHOD Move( dX, dY ) CLASS Point
   ::X := ::X + dX
   ::Y := ::Y + dY
   return Self

LLVM IR (651 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/oopclass.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_INITLINES()
declare void @HB_FUN_QOUT()
declare void @HB_FUN___CLSLOCKDEF()
declare void @HB_FUN_HBCLASS()
declare void @HB_FUN_HBOBJECT()
declare void @HB_FUN___CLSUNLOCKDEF()
declare void @HB_FUN___OBJHASMSG()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_OOPCLASS = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [101 x i8] c"\0D\01\00\24\04\00\30\02\00\B0\03\00\0C\00\5C\03\5C\04\70\02\50\01\24\05\00\30\04\00\5F\01\5C\0A\5C\14\70\02\49\24\06\00\B0\05\00\30\06\00\5F\01\70\00\30\07\00\5F\01\70\00\14\02\24\07\00\5F\01\8F\24\08\00\90\04\00\7A\7A\70\02\49\24\09\00\B0\05\00\90\06\00\70\00\90\07\00\70\00\14\02\91\24\0B\00\64\6E\07"
@.pcode.HB_FUN_POINT = internal constant [255 x i8] c"\95\03\00\74\16\00\24\0D\00\67\01\00\64\08\1D\E7\00\B0\08\00\68\01\00\0C\01\1D\DC\00\A6\9E\00\00\7A\50\01\30\02\00\B0\09\00\0C\00\6A\06\50\6F\69\6E\74\00\6C\0A\04\01\00\6C\03\70\03\50\02\24\0E\00\30\0B\00\5F\02\64\64\5F\01\79\48\79\48\79\48\6A\02\58\00\04\01\00\09\70\05\49\24\0F\00\30\0B\00\5F\02\64\64\5F\01\79\48\79\48\79\48\6A\02\59\00\04\01\00\09\70\05\49\24\10\00\30\0C\00\5F\02\6A\04\4E\65\77\00\6C\0D\5F\01\79\48\79\48\79\48\70\03\49\24\11\00\30\0C\00\5F\02\6A\05\4D\6F\76\65\00\6C\0E\5F\01\79\48\79\48\79\48\70\03\49\24\12\00\30\0F\00\5F\02\70\00\49\A7\0E\00\00\B0\10\00\68\01\00\5F\02\14\02\A8\30\11\00\5F\02\70\00\50\03\B0\12\00\5F\03\6A\0A\49\6E\69\74\43\6C\61\73\73\00\0C\02\1C\0C\30\13\00\5F\03\A4\92\01\00\49\5F\03\6E\07\30\11\00\67\01\00\70\00\6E\07"
@.pcode.HB_FUN_POINT_NEW = internal constant [33 x i8] c"\0D\00\02\24\15\00\30\14\00\66\5F\01\70\01\49\24\16\00\30\15\00\66\5F\02\70\01\49\24\17\00\66\6E\07"
@.pcode.HB_FUN_POINT_MOVE = internal constant [47 x i8] c"\0D\00\02\24\1A\00\30\14\00\66\30\06\00\66\70\00\5F\01\48\70\01\49\24\1B\00\30\15\00\66\30\07\00\66\70\00\5F\02\48\70\01\49\24\1C\00\66\6E\07"
@.pcode.hb_INITSTATICS = internal constant [6 x i8] c"\75\16\00\01\00\07"

@.sym.0 = private constant [9 x i8] c"\4F\4F\50\43\4C\41\53\53\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [4 x i8] c"\4E\45\57\00"
@.sym.3 = private constant [6 x i8] c"\50\4F\49\4E\54\00"
@.sym.4 = private constant [5 x i8] c"\4D\4F\56\45\00"
@.sym.5 = private constant [5 x i8] c"\51\4F\55\54\00"
@.sym.6 = private constant [2 x i8] c"\58\00"
@.sym.7 = private constant [2 x i8] c"\59\00"
@.sym.8 = private constant [13 x i8] c"\5F\5F\43\4C\53\4C\4F\43\4B\44\45\46\00"
@.sym.9 = private constant [8 x i8] c"\48\42\43\4C\41\53\53\00"
@.sym.10 = private constant [9 x i8] c"\48\42\4F\42\4A\45\43\54\00"
@.sym.11 = private constant [13 x i8] c"\41\44\44\4D\55\4C\54\49\44\41\54\41\00"
@.sym.12 = private constant [10 x i8] c"\41\44\44\4D\45\54\48\4F\44\00"
@.sym.13 = private constant [10 x i8] c"\50\4F\49\4E\54\5F\4E\45\57\00"
@.sym.14 = private constant [11 x i8] c"\50\4F\49\4E\54\5F\4D\4F\56\45\00"
@.sym.15 = private constant [7 x i8] c"\43\52\45\41\54\45\00"
@.sym.16 = private constant [15 x i8] c"\5F\5F\43\4C\53\55\4E\4C\4F\43\4B\44\45\46\00"
@.sym.17 = private constant [9 x i8] c"\49\4E\53\54\41\4E\43\45\00"
@.sym.18 = private constant [12 x i8] c"\5F\5F\4F\42\4A\48\41\53\4D\53\47\00"
@.sym.19 = private constant [10 x i8] c"\49\4E\49\54\43\4C\41\53\53\00"
@.sym.20 = private constant [3 x i8] c"\5F\58\00"
@.sym.21 = private constant [3 x i8] c"\5F\59\00"
@.sym.22 = private constant [20 x i8] c"\28\5F\49\4E\49\54\53\54\41\54\49\43\53\30\30\30\30\31\29\00"

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

@symbols_table = internal global [23 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_OOPCLASS 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([4 x i8], [4 x i8]* @.sym.2, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.3, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_POINT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.4, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.5, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([2 x i8], [2 x i8]* @.sym.6, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([2 x i8], [2 x i8]* @.sym.7, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([13 x i8], [13 x i8]* @.sym.8, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN___CLSLOCKDEF to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.9, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_HBCLASS to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.10, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_HBOBJECT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([13 x i8], [13 x i8]* @.sym.11, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.12, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.13, i32 0, i32 0),
           i64 514,
           i8* bitcast(void()* @HB_FUN_POINT_NEW to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.14, i32 0, i32 0),
           i64 514,
           i8* bitcast(void()* @HB_FUN_POINT_MOVE to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([7 x i8], [7 x i8]* @.sym.15, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([15 x i8], [15 x i8]* @.sym.16, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN___CLSUNLOCKDEF to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.17, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.18, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN___OBJHASMSG to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([10 x i8], [10 x i8]* @.sym.19, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([3 x i8], [3 x i8]* @.sym.20, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([3 x i8], [3 x i8]* @.sym.21, i32 0, i32 0),
           i64 33,
           i8* null,
           i8* null },
  %HB_SYMB { i8* getelementptr([20 x i8], [20 x i8]* @.sym.22, i32 0, i32 0),
           i64 536,
           i8* bitcast(void()* @hb_INITSTATICS to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %ipfs9a
ipfs9a:
  %r9b = call i32 @hb_vmsh_pushnil()
  %c9b = icmp ne i32 %r9b, 0
  br i1 %c9b, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_function(i32 0)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pushint(i32 3)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  %r16 = call i32 @hb_vmsh_pushint(i32 4)
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %i18
i18:
  %r18 = call i32 @hb_vmsh_send(i32 2)
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %i20
i20:
  %r20 = call i32 @hb_vmsh_poplocal(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_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushint(i32 10)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushint(i32 20)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_send(i32 2)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_pop()
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i37
i37:
  br label %i40
i40:
  %r40 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %ipfs40a
ipfs40a:
  %r40b = call i32 @hb_vmsh_pushnil()
  %c40b = icmp ne i32 %r40b, 0
  br i1 %c40b, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  %r48 = call i32 @hb_vmsh_send(i32 0)
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %epilogue, label %i50
i50:
  %r50 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c50 = icmp ne i32 %r50, 0
  br i1 %c50, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_send(i32 0)
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i57
i57:
  %r57 = call i32 @hb_vmsh_do(i32 2)
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %i59
i59:
  br label %i62
i62:
  %r62 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i64
i64:
  %r64 = call i32 @hb_vmsh_withobjectstart()
  %c64 = icmp ne i32 %r64, 0
  br i1 %c64, label %epilogue, label %i65
i65:
  br label %i68
i68:
  %r68 = call i32 @hb_vmsh_withobjectmessage(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c68 = icmp ne i32 %r68, 0
  br i1 %c68, label %epilogue, label %i71
i71:
  %r71 = call i32 @hb_vmsh_pushint(i32 1)
  %c71 = icmp ne i32 %r71, 0
  br i1 %c71, label %epilogue, label %i72
i72:
  %r72 = call i32 @hb_vmsh_pushint(i32 1)
  %c72 = icmp ne i32 %r72, 0
  br i1 %c72, label %epilogue, label %i73
i73:
  %r73 = call i32 @hb_vmsh_send(i32 2)
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %epilogue, label %i75
i75:
  %r75 = call i32 @hb_vmsh_pop()
  %c75 = icmp ne i32 %r75, 0
  br i1 %c75, label %epilogue, label %i76
i76:
  br label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %ipfs79a
ipfs79a:
  %r79b = call i32 @hb_vmsh_pushnil()
  %c79b = icmp ne i32 %r79b, 0
  br i1 %c79b, label %epilogue, label %i82
i82:
  %r82 = call i32 @hb_vmsh_withobjectmessage(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %epilogue, label %i85
i85:
  %r85 = call i32 @hb_vmsh_send(i32 0)
  %c85 = icmp ne i32 %r85, 0
  br i1 %c85, label %epilogue, label %i87
i87:
  %r87 = call i32 @hb_vmsh_withobjectmessage(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c87 = icmp ne i32 %r87, 0
  br i1 %c87, label %epilogue, label %i90
i90:
  %r90 = call i32 @hb_vmsh_send(i32 0)
  %c90 = icmp ne i32 %r90, 0
  br i1 %c90, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_do(i32 2)
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i94
i94:
  %r94 = call i32 @hb_vmsh_withobjectend()
  %c94 = icmp ne i32 %r94, 0
  br i1 %c94, label %epilogue, label %i95
i95:
  br label %i98
i98:
  %r98 = call i32 @hb_vmsh_pushnil()
  %c98 = icmp ne i32 %r98, 0
  br i1 %c98, label %epilogue, label %i99
i99:
  %r99 = call i32 @hb_vmsh_retvalue()
  %c99 = icmp ne i32 %r99, 0
  br i1 %c99, label %epilogue, label %i100
i100:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_POINT() {
  %s = load %HB_SYMB*, %HB_SYMB** @symbols
  call void @hb_vmExecute(i8* getelementptr([255 x i8], [255 x i8]* @.pcode.HB_FUN_POINT, i32 0, i32 0), %HB_SYMB* %s)
  ret void
}

define void @HB_FUN_POINT_NEW() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 2)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 20))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushself()
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i12
i12:
  %r12 = call i32 @hb_vmsh_send(i32 1)
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pop()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  br label %i18
i18:
  %r18 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 21))
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_pushself()
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_send(i32 1)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_pop()
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  br label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushself()
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i31
i31:
  %r31 = call i32 @hb_vmsh_retvalue()
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %i32
i32:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_POINT_MOVE() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 2)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 20))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushself()
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i10
i10:
  %r10 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushself()
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_send(i32 0)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  %r16 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c16 = icmp ne i32 %r16, 0
  br i1 %c16, label %epilogue, label %i18
i18:
  %r18 = call i32 @hb_vmsh_plus()
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_send(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  %r21 = call i32 @hb_vmsh_pop()
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %epilogue, label %i22
i22:
  br label %i25
i25:
  %r25 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 21))
  %c25 = icmp ne i32 %r25, 0
  br i1 %c25, label %epilogue, label %i28
i28:
  %r28 = call i32 @hb_vmsh_pushself()
  %c28 = icmp ne i32 %r28, 0
  br i1 %c28, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_message(%HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushself()
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_send(i32 0)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushlocal(i32 2)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_plus()
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_send(i32 1)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_pop()
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i41
i41:
  br label %i44
i44:
  %r44 = call i32 @hb_vmsh_pushself()
  %c44 = icmp ne i32 %r44, 0
  br i1 %c44, label %epilogue, label %i45
i45:
  %r45 = call i32 @hb_vmsh_retvalue()
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i46
i46:
  br label %epilogue
epilogue:
  ret void
}

define void @hb_INITSTATICS() {
  %s = load %HB_SYMB*, %HB_SYMB** @symbols
  call void @hb_vmExecute(i8* getelementptr([6 x i8], [6 x i8]* @.pcode.hb_INITSTATICS, i32 0, i32 0), %HB_SYMB* %s)
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([23 x %HB_SYMB], [23 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 23,
    i8* getelementptr([24 x i8], [24 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"

Program output

        13         24
        14         25

sequence.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

//
// Group I corpus — SEQUENCE opcodes straight-lined by the LLVM backend.
//
// Exercises the compatibility-critical paths in distinct functions:
//
//   TryNormal      try body completes normally, no BREAK
//   TryCatch       BREAK in try body, RECOVER catches
//   CrossFn        caller has SEQUENCE, callee does BREAK
//   Nested         inner try/catch inside outer try/catch
//   TryFinallyOk   ALWAYS runs after normal completion
//   TryFinallyBrk  BREAK in try, ALWAYS runs, no inner RECOVER, outer SEQUENCE catches
//

function Main()
   TryNormal()
   TryCatch()
   CrossFn()
   Nested()
   TryFinallyOk()
   TryFinallyBrk()
   TryCondBrk()
   ? "main done"
   return nil

function TryNormal()
   begin sequence
      ? "try-normal"
   end sequence
   ? "after-normal"
   return nil

function TryCatch()
   begin sequence
      ? "try-catch-pre"
      break
      ? "unreachable"
   recover
      ? "caught"
   end sequence
   ? "after-catch"
   return nil

function CrossFn()
   begin sequence
      Inner()
      ? "unreachable-outer"
   recover
      ? "caught-cross"
   end sequence
   return nil

function Inner()
   ? "inner-pre"
   break
   ? "unreachable-inner"
   return nil

function Nested()
   begin sequence
      begin sequence
         break
      recover
         ? "inner-caught"
      end sequence
      ? "after-inner"
      break
   recover
      ? "outer-caught"
   end sequence
   return nil

function TryFinallyOk()
   begin sequence
      ? "try-fin-ok"
   always
      ? "always-ran-ok"
   end sequence
   return nil

function TryFinallyBrk()
   begin sequence
      begin sequence
         ? "try-fin-brk"
         break
      always
         ? "always-ran-brk"
      end sequence
   recover
      ? "outer-recovered"
   end sequence
   return nil

function TryCondBrk()
   local lFlag := .T.
   begin sequence
      ? "cond-pre"
      if lFlag
         break
      endif
      ? "unreachable"
   recover
      ? "cond-caught"
   end sequence
   return nil

LLVM IR (1570 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/sequence.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()
declare void @HB_FUN_BREAK()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_SEQUENCE = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [82 x i8] c"\24\0F\00\B0\02\00\14\00\24\10\00\B0\03\00\14\00\24\11\00\B0\04\00\14\00\24\12\00\B0\05\00\14\00\24\13\00\B0\06\00\14\00\24\14\00\B0\07\00\14\00\24\15\00\B0\08\00\14\00\24\16\00\B0\09\00\6A\0A\6D\61\69\6E\20\64\6F\6E\65\00\14\01\24\17\00\64\6E\07"
@.pcode.HB_FUN_TRYNORMAL = internal constant [61 x i8] c"\24\1A\00\71\19\00\00\24\1B\00\B0\09\00\6A\0B\74\72\79\2D\6E\6F\72\6D\61\6C\00\14\01\72\04\00\00\24\1D\00\B0\09\00\6A\0D\61\66\74\65\72\2D\6E\6F\72\6D\61\6C\00\14\01\24\1E\00\64\6E\07"
@.pcode.HB_FUN_TRYCATCH = internal constant [115 x i8] c"\24\21\00\71\3E\00\00\24\22\00\B0\09\00\6A\0E\74\72\79\2D\63\61\74\63\68\2D\70\72\65\00\14\01\24\23\00\B0\0A\00\14\00\24\24\00\B0\09\00\6A\0C\75\6E\72\65\61\63\68\61\62\6C\65\00\14\01\72\1A\00\00\24\25\00\73\49\24\26\00\B0\09\00\6A\07\63\61\75\67\68\74\00\14\01\24\28\00\B0\09\00\6A\0C\61\66\74\65\72\2D\63\61\74\63\68\00\14\01\24\29\00\64\6E\07"
@.pcode.HB_FUN_CROSSFN = internal constant [81 x i8] c"\24\2C\00\71\2C\00\00\24\2D\00\B0\0B\00\14\00\24\2E\00\B0\09\00\6A\12\75\6E\72\65\61\63\68\61\62\6C\65\2D\6F\75\74\65\72\00\14\01\72\20\00\00\24\2F\00\73\49\24\30\00\B0\09\00\6A\0D\63\61\75\67\68\74\2D\63\72\6F\73\73\00\14\01\24\32\00\64\6E\07"
@.pcode.HB_FUN_INNER = internal constant [62 x i8] c"\24\35\00\B0\09\00\6A\0A\69\6E\6E\65\72\2D\70\72\65\00\14\01\24\36\00\B0\0A\00\14\00\24\37\00\B0\09\00\6A\12\75\6E\72\65\61\63\68\61\62\6C\65\2D\69\6E\6E\65\72\00\14\01\24\38\00\64\6E\07"
@.pcode.HB_FUN_NESTED = internal constant [122 x i8] c"\24\3B\00\71\55\00\00\24\3C\00\71\10\00\00\24\3D\00\B0\0A\00\14\00\72\20\00\00\24\3E\00\73\49\24\3F\00\B0\09\00\6A\0D\69\6E\6E\65\72\2D\63\61\75\67\68\74\00\14\01\24\41\00\B0\09\00\6A\0C\61\66\74\65\72\2D\69\6E\6E\65\72\00\14\01\24\42\00\B0\0A\00\14\00\72\20\00\00\24\43\00\73\49\24\44\00\B0\09\00\6A\0D\6F\75\74\65\72\2D\63\61\75\67\68\74\00\14\01\24\46\00\64\6E\07"
@.pcode.HB_FUN_TRYFINALLYOK = internal constant [63 x i8] c"\24\49\00\A6\19\00\00\24\4A\00\B0\09\00\6A\0B\74\72\79\2D\66\69\6E\2D\6F\6B\00\14\01\A7\1C\00\00\24\4C\00\B0\09\00\6A\0E\61\6C\77\61\79\73\2D\72\61\6E\2D\6F\6B\00\14\01\A8\24\4E\00\64\6E\07"
@.pcode.HB_FUN_TRYFINALLYBRK = internal constant [118 x i8] c"\24\51\00\71\4E\00\00\24\52\00\A6\22\00\00\24\53\00\B0\09\00\6A\0C\74\72\79\2D\66\69\6E\2D\62\72\6B\00\14\01\24\54\00\B0\0A\00\14\00\A7\1D\00\00\24\56\00\B0\09\00\6A\0F\61\6C\77\61\79\73\2D\72\61\6E\2D\62\72\6B\00\14\01\A8\24\57\00\72\23\00\00\24\58\00\73\49\24\59\00\B0\09\00\6A\10\6F\75\74\65\72\2D\72\65\63\6F\76\65\72\65\64\00\14\01\24\5B\00\64\6E\07"
@.pcode.HB_FUN_TRYCONDBRK = internal constant [109 x i8] c"\0D\01\00\24\5E\00\78\50\01\24\5F\00\71\40\00\00\24\60\00\B0\09\00\6A\09\63\6F\6E\64\2D\70\72\65\00\14\01\24\61\00\5F\01\1C\0A\24\62\00\B0\0A\00\14\00\24\64\00\B0\09\00\6A\0C\75\6E\72\65\61\63\68\61\62\6C\65\00\14\01\72\1F\00\00\24\65\00\73\49\24\66\00\B0\09\00\6A\0C\63\6F\6E\64\2D\63\61\75\67\68\74\00\14\01\24\68\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\53\45\51\55\45\4E\43\45\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [10 x i8] c"\54\52\59\4E\4F\52\4D\41\4C\00"
@.sym.3 = private constant [9 x i8] c"\54\52\59\43\41\54\43\48\00"
@.sym.4 = private constant [8 x i8] c"\43\52\4F\53\53\46\4E\00"
@.sym.5 = private constant [7 x i8] c"\4E\45\53\54\45\44\00"
@.sym.6 = private constant [13 x i8] c"\54\52\59\46\49\4E\41\4C\4C\59\4F\4B\00"
@.sym.7 = private constant [14 x i8] c"\54\52\59\46\49\4E\41\4C\4C\59\42\52\4B\00"
@.sym.8 = private constant [11 x i8] c"\54\52\59\43\4F\4E\44\42\52\4B\00"
@.sym.9 = private constant [5 x i8] c"\51\4F\55\54\00"
@.sym.10 = private constant [6 x i8] c"\42\52\45\41\4B\00"
@.sym.11 = private constant [6 x i8] c"\49\4E\4E\45\52\00"

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

@symbols_table = internal global [12 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_SEQUENCE 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([10 x i8], [10 x i8]* @.sym.2, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TRYNORMAL to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.3, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TRYCATCH to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.4, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_CROSSFN to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([7 x i8], [7 x i8]* @.sym.5, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_NESTED to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([13 x i8], [13 x i8]* @.sym.6, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TRYFINALLYOK to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([14 x i8], [14 x i8]* @.sym.7, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TRYFINALLYBRK to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.8, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_TRYCONDBRK to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.9, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.10, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_BREAK to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([6 x i8], [6 x i8]* @.sym.11, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_INNER to i8*),
           i8* null }
]

@.sl.str.0 = private constant [10 x i8] c"\6D\61\69\6E\20\64\6F\6E\65\00"
@.sl.str.1 = private constant [11 x i8] c"\74\72\79\2D\6E\6F\72\6D\61\6C\00"
@.sl.str.2 = private constant [13 x i8] c"\61\66\74\65\72\2D\6E\6F\72\6D\61\6C\00"
@.sl.str.3 = private constant [14 x i8] c"\74\72\79\2D\63\61\74\63\68\2D\70\72\65\00"
@.sl.str.4 = private constant [12 x i8] c"\75\6E\72\65\61\63\68\61\62\6C\65\00"
@.sl.str.5 = private constant [7 x i8] c"\63\61\75\67\68\74\00"
@.sl.str.6 = private constant [12 x i8] c"\61\66\74\65\72\2D\63\61\74\63\68\00"
@.sl.str.7 = private constant [18 x i8] c"\75\6E\72\65\61\63\68\61\62\6C\65\2D\6F\75\74\65\72\00"
@.sl.str.8 = private constant [13 x i8] c"\63\61\75\67\68\74\2D\63\72\6F\73\73\00"
@.sl.str.9 = private constant [10 x i8] c"\69\6E\6E\65\72\2D\70\72\65\00"
@.sl.str.10 = private constant [18 x i8] c"\75\6E\72\65\61\63\68\61\62\6C\65\2D\69\6E\6E\65\72\00"
@.sl.str.11 = private constant [13 x i8] c"\69\6E\6E\65\72\2D\63\61\75\67\68\74\00"
@.sl.str.12 = private constant [12 x i8] c"\61\66\74\65\72\2D\69\6E\6E\65\72\00"
@.sl.str.13 = private constant [13 x i8] c"\6F\75\74\65\72\2D\63\61\75\67\68\74\00"
@.sl.str.14 = private constant [11 x i8] c"\74\72\79\2D\66\69\6E\2D\6F\6B\00"
@.sl.str.15 = private constant [14 x i8] c"\61\6C\77\61\79\73\2D\72\61\6E\2D\6F\6B\00"
@.sl.str.16 = private constant [12 x i8] c"\74\72\79\2D\66\69\6E\2D\62\72\6B\00"
@.sl.str.17 = private constant [15 x i8] c"\61\6C\77\61\79\73\2D\72\61\6E\2D\62\72\6B\00"
@.sl.str.18 = private constant [16 x i8] c"\6F\75\74\65\72\2D\72\65\63\6F\76\65\72\65\64\00"
@.sl.str.19 = private constant [9 x i8] c"\63\6F\6E\64\2D\70\72\65\00"
@.sl.str.20 = private constant [12 x i8] c"\75\6E\72\65\61\63\68\61\62\6C\65\00"
@.sl.str.21 = private constant [12 x i8] c"\63\6F\6E\64\2D\63\61\75\67\68\74\00"

define void @HB_FUN_SEQUENCE() {
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([12 x %HB_SYMB], [12 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_do(i32 0)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i8
i8:
  br label %i11
i11:
  %r11 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %ipfs11a
ipfs11a:
  %r11b = call i32 @hb_vmsh_pushnil()
  %c11b = icmp ne i32 %r11b, 0
  br i1 %c11b, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_do(i32 0)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %ipfs19a
ipfs19a:
  %r19b = call i32 @hb_vmsh_pushnil()
  %c19b = icmp ne i32 %r19b, 0
  br i1 %c19b, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_do(i32 0)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  br label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %ipfs27a
ipfs27a:
  %r27b = call i32 @hb_vmsh_pushnil()
  %c27b = icmp ne i32 %r27b, 0
  br i1 %c27b, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_do(i32 0)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  br label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 6))
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %ipfs35a
ipfs35a:
  %r35b = call i32 @hb_vmsh_pushnil()
  %c35b = icmp ne i32 %r35b, 0
  br i1 %c35b, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_do(i32 0)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i40
i40:
  br label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 7))
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %ipfs43a
ipfs43a:
  %r43b = call i32 @hb_vmsh_pushnil()
  %c43b = icmp ne i32 %r43b, 0
  br i1 %c43b, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_do(i32 0)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 8))
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %ipfs51a
ipfs51a:
  %r51b = call i32 @hb_vmsh_pushnil()
  %c51b = icmp ne i32 %r51b, 0
  br i1 %c51b, label %epilogue, label %i54
i54:
  %r54 = call i32 @hb_vmsh_do(i32 0)
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %i56
i56:
  br label %i59
i59:
  %r59 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %ipfs59a
ipfs59a:
  %r59b = call i32 @hb_vmsh_pushnil()
  %c59b = icmp ne i32 %r59b, 0
  br i1 %c59b, label %epilogue, label %i62
i62:
  %r62 = call i32 @hb_vmsh_pushstring(i8* getelementptr([10 x i8], [10 x i8]* @.sl.str.0, i32 0, i32 0), i64 9)
  %c62 = icmp ne i32 %r62, 0
  br i1 %c62, label %epilogue, label %i74
i74:
  %r74 = call i32 @hb_vmsh_do(i32 1)
  %c74 = icmp ne i32 %r74, 0
  br i1 %c74, label %epilogue, label %i76
i76:
  br label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushnil()
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %i80
i80:
  %r80 = call i32 @hb_vmsh_retvalue()
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i81
i81:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TRYNORMAL() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([61 x i8], [61 x i8]* @.pcode.HB_FUN_TRYNORMAL, i32 0, i32 28))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i7
i7:
  br label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %seqdc10, label %ipfs10a
seqdc10:
  %brkc10 = icmp eq i32 %r10, 2
  br i1 %brkc10, label %i28, label %seqqc10
seqqc10:
  br label %epilogue
ipfs10a:
  %r10b = call i32 @hb_vmsh_pushnil()
  %c10b = icmp ne i32 %r10b, 0
  br i1 %c10b, label %seqdb10, label %i13
seqdb10:
  %brkb10 = icmp eq i32 %r10b, 2
  br i1 %brkb10, label %i28, label %seqqb10
seqqb10:
  br label %epilogue
i13:
  %r13 = call i32 @hb_vmsh_pushstring(i8* getelementptr([11 x i8], [11 x i8]* @.sl.str.1, i32 0, i32 0), i64 10)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %seqd13, label %i26
seqd13:
  %brk13 = icmp eq i32 %r13, 2
  br i1 %brk13, label %i28, label %seqq13
seqq13:
  br label %epilogue
i26:
  %r26 = call i32 @hb_vmsh_do(i32 1)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %seqd26, label %i28
seqd26:
  %brk26 = icmp eq i32 %r26, 2
  br i1 %brk26, label %i28, label %seqq26
seqq26:
  br label %epilogue
i28:
  %r28 = call i32 @hb_vmsh_seqend()
  br label %i32
i32:
  br label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %ipfs35a
ipfs35a:
  %r35b = call i32 @hb_vmsh_pushnil()
  %c35b = icmp ne i32 %r35b, 0
  br i1 %c35b, label %epilogue, label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushstring(i8* getelementptr([13 x i8], [13 x i8]* @.sl.str.2, i32 0, i32 0), i64 12)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_do(i32 1)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i55
i55:
  br label %i58
i58:
  %r58 = call i32 @hb_vmsh_pushnil()
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_retvalue()
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i60
i60:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TRYCATCH() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([115 x i8], [115 x i8]* @.pcode.HB_FUN_TRYCATCH, i32 0, i32 65))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i7
i7:
  br label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %seqdc10, label %ipfs10a
seqdc10:
  %brkc10 = icmp eq i32 %r10, 2
  br i1 %brkc10, label %i65, label %seqqc10
seqqc10:
  br label %epilogue
ipfs10a:
  %r10b = call i32 @hb_vmsh_pushnil()
  %c10b = icmp ne i32 %r10b, 0
  br i1 %c10b, label %seqdb10, label %i13
seqdb10:
  %brkb10 = icmp eq i32 %r10b, 2
  br i1 %brkb10, label %i65, label %seqqb10
seqqb10:
  br label %epilogue
i13:
  %r13 = call i32 @hb_vmsh_pushstring(i8* getelementptr([14 x i8], [14 x i8]* @.sl.str.3, i32 0, i32 0), i64 13)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %seqd13, label %i29
seqd13:
  %brk13 = icmp eq i32 %r13, 2
  br i1 %brk13, label %i65, label %seqq13
seqq13:
  br label %epilogue
i29:
  %r29 = call i32 @hb_vmsh_do(i32 1)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %seqd29, label %i31
seqd29:
  %brk29 = icmp eq i32 %r29, 2
  br i1 %brk29, label %i65, label %seqq29
seqq29:
  br label %epilogue
i31:
  br label %i34
i34:
  %r34 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %seqdc34, label %ipfs34a
seqdc34:
  %brkc34 = icmp eq i32 %r34, 2
  br i1 %brkc34, label %i65, label %seqqc34
seqqc34:
  br label %epilogue
ipfs34a:
  %r34b = call i32 @hb_vmsh_pushnil()
  %c34b = icmp ne i32 %r34b, 0
  br i1 %c34b, label %seqdb34, label %i37
seqdb34:
  %brkb34 = icmp eq i32 %r34b, 2
  br i1 %brkb34, label %i65, label %seqqb34
seqqb34:
  br label %epilogue
i37:
  %r37 = call i32 @hb_vmsh_do(i32 0)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %seqd37, label %i39
seqd37:
  %brk37 = icmp eq i32 %r37, 2
  br i1 %brk37, label %i65, label %seqq37
seqq37:
  br label %epilogue
i39:
  br label %i42
i42:
  %r42 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %seqdc42, label %ipfs42a
seqdc42:
  %brkc42 = icmp eq i32 %r42, 2
  br i1 %brkc42, label %i65, label %seqqc42
seqqc42:
  br label %epilogue
ipfs42a:
  %r42b = call i32 @hb_vmsh_pushnil()
  %c42b = icmp ne i32 %r42b, 0
  br i1 %c42b, label %seqdb42, label %i45
seqdb42:
  %brkb42 = icmp eq i32 %r42b, 2
  br i1 %brkb42, label %i65, label %seqqb42
seqqb42:
  br label %epilogue
i45:
  %r45 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.4, i32 0, i32 0), i64 11)
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %seqd45, label %i59
seqd45:
  %brk45 = icmp eq i32 %r45, 2
  br i1 %brk45, label %i65, label %seqq45
seqq45:
  br label %epilogue
i59:
  %r59 = call i32 @hb_vmsh_do(i32 1)
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %seqd59, label %i61
seqd59:
  %brk59 = icmp eq i32 %r59, 2
  br i1 %brk59, label %i65, label %seqq59
seqq59:
  br label %epilogue
i61:
  %r61 = call i32 @hb_vmsh_seqend()
  br label %i87
i65:
  br label %i68
i68:
  %r68 = call i32 @hb_vmsh_seqrecover()
  br label %i69
i69:
  %r69 = call i32 @hb_vmsh_pop()
  %c69 = icmp ne i32 %r69, 0
  br i1 %c69, label %epilogue, label %i70
i70:
  br label %i73
i73:
  %r73 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %epilogue, label %ipfs73a
ipfs73a:
  %r73b = call i32 @hb_vmsh_pushnil()
  %c73b = icmp ne i32 %r73b, 0
  br i1 %c73b, label %epilogue, label %i76
i76:
  %r76 = call i32 @hb_vmsh_pushstring(i8* getelementptr([7 x i8], [7 x i8]* @.sl.str.5, i32 0, i32 0), i64 6)
  %c76 = icmp ne i32 %r76, 0
  br i1 %c76, label %epilogue, label %i85
i85:
  %r85 = call i32 @hb_vmsh_do(i32 1)
  %c85 = icmp ne i32 %r85, 0
  br i1 %c85, label %epilogue, label %i87
i87:
  br label %i90
i90:
  %r90 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c90 = icmp ne i32 %r90, 0
  br i1 %c90, label %epilogue, label %ipfs90a
ipfs90a:
  %r90b = call i32 @hb_vmsh_pushnil()
  %c90b = icmp ne i32 %r90b, 0
  br i1 %c90b, label %epilogue, label %i93
i93:
  %r93 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.6, i32 0, i32 0), i64 11)
  %c93 = icmp ne i32 %r93, 0
  br i1 %c93, label %epilogue, label %i107
i107:
  %r107 = call i32 @hb_vmsh_do(i32 1)
  %c107 = icmp ne i32 %r107, 0
  br i1 %c107, label %epilogue, label %i109
i109:
  br label %i112
i112:
  %r112 = call i32 @hb_vmsh_pushnil()
  %c112 = icmp ne i32 %r112, 0
  br i1 %c112, label %epilogue, label %i113
i113:
  %r113 = call i32 @hb_vmsh_retvalue()
  %c113 = icmp ne i32 %r113, 0
  br i1 %c113, label %epilogue, label %i114
i114:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_CROSSFN() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([81 x i8], [81 x i8]* @.pcode.HB_FUN_CROSSFN, i32 0, i32 47))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i7
i7:
  br label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 11))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %seqdc10, label %ipfs10a
seqdc10:
  %brkc10 = icmp eq i32 %r10, 2
  br i1 %brkc10, label %i47, label %seqqc10
seqqc10:
  br label %epilogue
ipfs10a:
  %r10b = call i32 @hb_vmsh_pushnil()
  %c10b = icmp ne i32 %r10b, 0
  br i1 %c10b, label %seqdb10, label %i13
seqdb10:
  %brkb10 = icmp eq i32 %r10b, 2
  br i1 %brkb10, label %i47, label %seqqb10
seqqb10:
  br label %epilogue
i13:
  %r13 = call i32 @hb_vmsh_do(i32 0)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %seqd13, label %i15
seqd13:
  %brk13 = icmp eq i32 %r13, 2
  br i1 %brk13, label %i47, label %seqq13
seqq13:
  br label %epilogue
i15:
  br label %i18
i18:
  %r18 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %seqdc18, label %ipfs18a
seqdc18:
  %brkc18 = icmp eq i32 %r18, 2
  br i1 %brkc18, label %i47, label %seqqc18
seqqc18:
  br label %epilogue
ipfs18a:
  %r18b = call i32 @hb_vmsh_pushnil()
  %c18b = icmp ne i32 %r18b, 0
  br i1 %c18b, label %seqdb18, label %i21
seqdb18:
  %brkb18 = icmp eq i32 %r18b, 2
  br i1 %brkb18, label %i47, label %seqqb18
seqqb18:
  br label %epilogue
i21:
  %r21 = call i32 @hb_vmsh_pushstring(i8* getelementptr([18 x i8], [18 x i8]* @.sl.str.7, i32 0, i32 0), i64 17)
  %c21 = icmp ne i32 %r21, 0
  br i1 %c21, label %seqd21, label %i41
seqd21:
  %brk21 = icmp eq i32 %r21, 2
  br i1 %brk21, label %i47, label %seqq21
seqq21:
  br label %epilogue
i41:
  %r41 = call i32 @hb_vmsh_do(i32 1)
  %c41 = icmp ne i32 %r41, 0
  br i1 %c41, label %seqd41, label %i43
seqd41:
  %brk41 = icmp eq i32 %r41, 2
  br i1 %brk41, label %i47, label %seqq41
seqq41:
  br label %epilogue
i43:
  %r43 = call i32 @hb_vmsh_seqend()
  br label %i75
i47:
  br label %i50
i50:
  %r50 = call i32 @hb_vmsh_seqrecover()
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_pop()
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %epilogue, label %i52
i52:
  br label %i55
i55:
  %r55 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %ipfs55a
ipfs55a:
  %r55b = call i32 @hb_vmsh_pushnil()
  %c55b = icmp ne i32 %r55b, 0
  br i1 %c55b, label %epilogue, label %i58
i58:
  %r58 = call i32 @hb_vmsh_pushstring(i8* getelementptr([13 x i8], [13 x i8]* @.sl.str.8, i32 0, i32 0), i64 12)
  %c58 = icmp ne i32 %r58, 0
  br i1 %c58, label %epilogue, label %i73
i73:
  %r73 = call i32 @hb_vmsh_do(i32 1)
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %epilogue, label %i75
i75:
  br label %i78
i78:
  %r78 = call i32 @hb_vmsh_pushnil()
  %c78 = icmp ne i32 %r78, 0
  br i1 %c78, label %epilogue, label %i79
i79:
  %r79 = call i32 @hb_vmsh_retvalue()
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %i80
i80:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_INNER() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %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([10 x i8], [10 x i8]* @.sl.str.9, i32 0, i32 0), i64 9)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i18
i18:
  %r18 = call i32 @hb_vmsh_do(i32 1)
  %c18 = icmp ne i32 %r18, 0
  br i1 %c18, label %epilogue, label %i20
i20:
  br label %i23
i23:
  %r23 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %ipfs23a
ipfs23a:
  %r23b = call i32 @hb_vmsh_pushnil()
  %c23b = icmp ne i32 %r23b, 0
  br i1 %c23b, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_do(i32 0)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i28
i28:
  br label %i31
i31:
  %r31 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c31 = icmp ne i32 %r31, 0
  br i1 %c31, label %epilogue, label %ipfs31a
ipfs31a:
  %r31b = call i32 @hb_vmsh_pushnil()
  %c31b = icmp ne i32 %r31b, 0
  br i1 %c31b, label %epilogue, label %i34
i34:
  %r34 = call i32 @hb_vmsh_pushstring(i8* getelementptr([18 x i8], [18 x i8]* @.sl.str.10, i32 0, i32 0), i64 17)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %epilogue, label %i54
i54:
  %r54 = call i32 @hb_vmsh_do(i32 1)
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %i56
i56:
  br label %i59
i59:
  %r59 = call i32 @hb_vmsh_pushnil()
  %c59 = icmp ne i32 %r59, 0
  br i1 %c59, label %epilogue, label %i60
i60:
  %r60 = call i32 @hb_vmsh_retvalue()
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %epilogue, label %i61
i61:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_NESTED() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([122 x i8], [122 x i8]* @.pcode.HB_FUN_NESTED, i32 0, i32 88))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i7
i7:
  br label %i10
i10:
  %r10 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([122 x i8], [122 x i8]* @.pcode.HB_FUN_NESTED, i32 0, i32 26))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %seqd10, label %i14
seqd10:
  %brk10 = icmp eq i32 %r10, 2
  br i1 %brk10, label %i88, label %seqq10
seqq10:
  br label %epilogue
i14:
  br label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %seqdc17, label %ipfs17a
seqdc17:
  %brkc17 = icmp eq i32 %r17, 2
  br i1 %brkc17, label %i26, label %seqqc17
seqqc17:
  br label %epilogue
ipfs17a:
  %r17b = call i32 @hb_vmsh_pushnil()
  %c17b = icmp ne i32 %r17b, 0
  br i1 %c17b, label %seqdb17, label %i20
seqdb17:
  %brkb17 = icmp eq i32 %r17b, 2
  br i1 %brkb17, label %i26, label %seqqb17
seqqb17:
  br label %epilogue
i20:
  %r20 = call i32 @hb_vmsh_do(i32 0)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %seqd20, label %i22
seqd20:
  %brk20 = icmp eq i32 %r20, 2
  br i1 %brk20, label %i26, label %seqq20
seqq20:
  br label %epilogue
i22:
  %r22 = call i32 @hb_vmsh_seqend()
  br label %i54
i26:
  br label %i29
i29:
  %r29 = call i32 @hb_vmsh_seqrecover()
  br label %i30
i30:
  %r30 = call i32 @hb_vmsh_pop()
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %seqd30, label %i31
seqd30:
  %brk30 = icmp eq i32 %r30, 2
  br i1 %brk30, label %i88, label %seqq30
seqq30:
  br label %epilogue
i31:
  br label %i34
i34:
  %r34 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %seqdc34, label %ipfs34a
seqdc34:
  %brkc34 = icmp eq i32 %r34, 2
  br i1 %brkc34, label %i88, label %seqqc34
seqqc34:
  br label %epilogue
ipfs34a:
  %r34b = call i32 @hb_vmsh_pushnil()
  %c34b = icmp ne i32 %r34b, 0
  br i1 %c34b, label %seqdb34, label %i37
seqdb34:
  %brkb34 = icmp eq i32 %r34b, 2
  br i1 %brkb34, label %i88, label %seqqb34
seqqb34:
  br label %epilogue
i37:
  %r37 = call i32 @hb_vmsh_pushstring(i8* getelementptr([13 x i8], [13 x i8]* @.sl.str.11, i32 0, i32 0), i64 12)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %seqd37, label %i52
seqd37:
  %brk37 = icmp eq i32 %r37, 2
  br i1 %brk37, label %i88, label %seqq37
seqq37:
  br label %epilogue
i52:
  %r52 = call i32 @hb_vmsh_do(i32 1)
  %c52 = icmp ne i32 %r52, 0
  br i1 %c52, label %seqd52, label %i54
seqd52:
  %brk52 = icmp eq i32 %r52, 2
  br i1 %brk52, label %i88, label %seqq52
seqq52:
  br label %epilogue
i54:
  br label %i57
i57:
  %r57 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %seqdc57, label %ipfs57a
seqdc57:
  %brkc57 = icmp eq i32 %r57, 2
  br i1 %brkc57, label %i88, label %seqqc57
seqqc57:
  br label %epilogue
ipfs57a:
  %r57b = call i32 @hb_vmsh_pushnil()
  %c57b = icmp ne i32 %r57b, 0
  br i1 %c57b, label %seqdb57, label %i60
seqdb57:
  %brkb57 = icmp eq i32 %r57b, 2
  br i1 %brkb57, label %i88, label %seqqb57
seqqb57:
  br label %epilogue
i60:
  %r60 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.12, i32 0, i32 0), i64 11)
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %seqd60, label %i74
seqd60:
  %brk60 = icmp eq i32 %r60, 2
  br i1 %brk60, label %i88, label %seqq60
seqq60:
  br label %epilogue
i74:
  %r74 = call i32 @hb_vmsh_do(i32 1)
  %c74 = icmp ne i32 %r74, 0
  br i1 %c74, label %seqd74, label %i76
seqd74:
  %brk74 = icmp eq i32 %r74, 2
  br i1 %brk74, label %i88, label %seqq74
seqq74:
  br label %epilogue
i76:
  br label %i79
i79:
  %r79 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %seqdc79, label %ipfs79a
seqdc79:
  %brkc79 = icmp eq i32 %r79, 2
  br i1 %brkc79, label %i88, label %seqqc79
seqqc79:
  br label %epilogue
ipfs79a:
  %r79b = call i32 @hb_vmsh_pushnil()
  %c79b = icmp ne i32 %r79b, 0
  br i1 %c79b, label %seqdb79, label %i82
seqdb79:
  %brkb79 = icmp eq i32 %r79b, 2
  br i1 %brkb79, label %i88, label %seqqb79
seqqb79:
  br label %epilogue
i82:
  %r82 = call i32 @hb_vmsh_do(i32 0)
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %seqd82, label %i84
seqd82:
  %brk82 = icmp eq i32 %r82, 2
  br i1 %brk82, label %i88, label %seqq82
seqq82:
  br label %epilogue
i84:
  %r84 = call i32 @hb_vmsh_seqend()
  br label %i116
i88:
  br label %i91
i91:
  %r91 = call i32 @hb_vmsh_seqrecover()
  br label %i92
i92:
  %r92 = call i32 @hb_vmsh_pop()
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i93
i93:
  br label %i96
i96:
  %r96 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c96 = icmp ne i32 %r96, 0
  br i1 %c96, label %epilogue, label %ipfs96a
ipfs96a:
  %r96b = call i32 @hb_vmsh_pushnil()
  %c96b = icmp ne i32 %r96b, 0
  br i1 %c96b, label %epilogue, label %i99
i99:
  %r99 = call i32 @hb_vmsh_pushstring(i8* getelementptr([13 x i8], [13 x i8]* @.sl.str.13, i32 0, i32 0), i64 12)
  %c99 = icmp ne i32 %r99, 0
  br i1 %c99, label %epilogue, label %i114
i114:
  %r114 = call i32 @hb_vmsh_do(i32 1)
  %c114 = icmp ne i32 %r114, 0
  br i1 %c114, label %epilogue, label %i116
i116:
  br label %i119
i119:
  %r119 = call i32 @hb_vmsh_pushnil()
  %c119 = icmp ne i32 %r119, 0
  br i1 %c119, label %epilogue, label %i120
i120:
  %r120 = call i32 @hb_vmsh_retvalue()
  %c120 = icmp ne i32 %r120, 0
  br i1 %c120, label %epilogue, label %i121
i121:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TRYFINALLYOK() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_seqalways(i8* getelementptr([63 x i8], [63 x i8]* @.pcode.HB_FUN_TRYFINALLYOK, i32 0, i32 28))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i7
i7:
  br label %i10
i10:
  %r10 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %seqdc10, label %ipfs10a
seqdc10:
  %brkc10 = icmp eq i32 %r10, 2
  br i1 %brkc10, label %i28, label %seqqc10
seqqc10:
  %qitc10 = icmp eq i32 %r10, 1
  br i1 %qitc10, label %i28, label %epilogue
ipfs10a:
  %r10b = call i32 @hb_vmsh_pushnil()
  %c10b = icmp ne i32 %r10b, 0
  br i1 %c10b, label %seqdb10, label %i13
seqdb10:
  %brkb10 = icmp eq i32 %r10b, 2
  br i1 %brkb10, label %i28, label %seqqb10
seqqb10:
  %qitb10 = icmp eq i32 %r10b, 1
  br i1 %qitb10, label %i28, label %epilogue
i13:
  %r13 = call i32 @hb_vmsh_pushstring(i8* getelementptr([11 x i8], [11 x i8]* @.sl.str.14, i32 0, i32 0), i64 10)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %seqd13, label %i26
seqd13:
  %brk13 = icmp eq i32 %r13, 2
  br i1 %brk13, label %i28, label %seqq13
seqq13:
  %qit13 = icmp eq i32 %r13, 1
  br i1 %qit13, label %i28, label %epilogue
i26:
  %r26 = call i32 @hb_vmsh_do(i32 1)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %seqd26, label %i28
seqd26:
  %brk26 = icmp eq i32 %r26, 2
  br i1 %brk26, label %i28, label %seqq26
seqq26:
  %qit26 = icmp eq i32 %r26, 1
  br i1 %qit26, label %i28, label %epilogue
i28:
  %r28 = call i32 @hb_vmsh_alwaysbegin(i8* getelementptr([63 x i8], [63 x i8]* @.pcode.HB_FUN_TRYFINALLYOK, i32 0, i32 56))
  br label %i32
i32:
  br label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %seqdc35, label %ipfs35a
seqdc35:
  %brkc35 = icmp eq i32 %r35, 2
  br i1 %brkc35, label %i28, label %seqqc35
seqqc35:
  %qitc35 = icmp eq i32 %r35, 1
  br i1 %qitc35, label %i28, label %epilogue
ipfs35a:
  %r35b = call i32 @hb_vmsh_pushnil()
  %c35b = icmp ne i32 %r35b, 0
  br i1 %c35b, label %seqdb35, label %i38
seqdb35:
  %brkb35 = icmp eq i32 %r35b, 2
  br i1 %brkb35, label %i28, label %seqqb35
seqqb35:
  %qitb35 = icmp eq i32 %r35b, 1
  br i1 %qitb35, label %i28, label %epilogue
i38:
  %r38 = call i32 @hb_vmsh_pushstring(i8* getelementptr([14 x i8], [14 x i8]* @.sl.str.15, i32 0, i32 0), i64 13)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %seqd38, label %i54
seqd38:
  %brk38 = icmp eq i32 %r38, 2
  br i1 %brk38, label %i28, label %seqq38
seqq38:
  %qit38 = icmp eq i32 %r38, 1
  br i1 %qit38, label %i28, label %epilogue
i54:
  %r54 = call i32 @hb_vmsh_do(i32 1)
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %seqd54, label %i56
seqd54:
  %brk54 = icmp eq i32 %r54, 2
  br i1 %brk54, label %i28, label %seqq54
seqq54:
  %qit54 = icmp eq i32 %r54, 1
  br i1 %qit54, label %i28, label %epilogue
i56:
  %r56 = call i32 @hb_vmsh_alwaysend()
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %epilogue, label %i57
i57:
  br label %i60
i60:
  %r60 = call i32 @hb_vmsh_pushnil()
  %c60 = icmp ne i32 %r60, 0
  br i1 %c60, label %epilogue, label %i61
i61:
  %r61 = call i32 @hb_vmsh_retvalue()
  %c61 = icmp ne i32 %r61, 0
  br i1 %c61, label %epilogue, label %i62
i62:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TRYFINALLYBRK() {
entry:
  br label %i0
i0:
  br label %i3
i3:
  %r3 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([118 x i8], [118 x i8]* @.pcode.HB_FUN_TRYFINALLYBRK, i32 0, i32 81))
  %c3 = icmp ne i32 %r3, 0
  br i1 %c3, label %epilogue, label %i7
i7:
  br label %i10
i10:
  %r10 = call i32 @hb_vmsh_seqalways(i8* getelementptr([118 x i8], [118 x i8]* @.pcode.HB_FUN_TRYFINALLYBRK, i32 0, i32 44))
  %c10 = icmp ne i32 %r10, 0
  br i1 %c10, label %seqd10, label %i14
seqd10:
  %brk10 = icmp eq i32 %r10, 2
  br i1 %brk10, label %i81, label %seqq10
seqq10:
  br label %epilogue
i14:
  br label %i17
i17:
  %r17 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c17 = icmp ne i32 %r17, 0
  br i1 %c17, label %seqdc17, label %ipfs17a
seqdc17:
  %brkc17 = icmp eq i32 %r17, 2
  br i1 %brkc17, label %i44, label %seqqc17
seqqc17:
  %qitc17 = icmp eq i32 %r17, 1
  br i1 %qitc17, label %i44, label %epilogue
ipfs17a:
  %r17b = call i32 @hb_vmsh_pushnil()
  %c17b = icmp ne i32 %r17b, 0
  br i1 %c17b, label %seqdb17, label %i20
seqdb17:
  %brkb17 = icmp eq i32 %r17b, 2
  br i1 %brkb17, label %i44, label %seqqb17
seqqb17:
  %qitb17 = icmp eq i32 %r17b, 1
  br i1 %qitb17, label %i44, label %epilogue
i20:
  %r20 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.16, i32 0, i32 0), i64 11)
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %seqd20, label %i34
seqd20:
  %brk20 = icmp eq i32 %r20, 2
  br i1 %brk20, label %i44, label %seqq20
seqq20:
  %qit20 = icmp eq i32 %r20, 1
  br i1 %qit20, label %i44, label %epilogue
i34:
  %r34 = call i32 @hb_vmsh_do(i32 1)
  %c34 = icmp ne i32 %r34, 0
  br i1 %c34, label %seqd34, label %i36
seqd34:
  %brk34 = icmp eq i32 %r34, 2
  br i1 %brk34, label %i44, label %seqq34
seqq34:
  %qit34 = icmp eq i32 %r34, 1
  br i1 %qit34, label %i44, label %epilogue
i36:
  br label %i39
i39:
  %r39 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %seqdc39, label %ipfs39a
seqdc39:
  %brkc39 = icmp eq i32 %r39, 2
  br i1 %brkc39, label %i44, label %seqqc39
seqqc39:
  %qitc39 = icmp eq i32 %r39, 1
  br i1 %qitc39, label %i44, label %epilogue
ipfs39a:
  %r39b = call i32 @hb_vmsh_pushnil()
  %c39b = icmp ne i32 %r39b, 0
  br i1 %c39b, label %seqdb39, label %i42
seqdb39:
  %brkb39 = icmp eq i32 %r39b, 2
  br i1 %brkb39, label %i44, label %seqqb39
seqqb39:
  %qitb39 = icmp eq i32 %r39b, 1
  br i1 %qitb39, label %i44, label %epilogue
i42:
  %r42 = call i32 @hb_vmsh_do(i32 0)
  %c42 = icmp ne i32 %r42, 0
  br i1 %c42, label %seqd42, label %i44
seqd42:
  %brk42 = icmp eq i32 %r42, 2
  br i1 %brk42, label %i44, label %seqq42
seqq42:
  %qit42 = icmp eq i32 %r42, 1
  br i1 %qit42, label %i44, label %epilogue
i44:
  %r44 = call i32 @hb_vmsh_alwaysbegin(i8* getelementptr([118 x i8], [118 x i8]* @.pcode.HB_FUN_TRYFINALLYBRK, i32 0, i32 73))
  br label %i48
i48:
  br label %i51
i51:
  %r51 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c51 = icmp ne i32 %r51, 0
  br i1 %c51, label %seqdc51, label %ipfs51a
seqdc51:
  %brkc51 = icmp eq i32 %r51, 2
  br i1 %brkc51, label %i44, label %seqqc51
seqqc51:
  %qitc51 = icmp eq i32 %r51, 1
  br i1 %qitc51, label %i44, label %epilogue
ipfs51a:
  %r51b = call i32 @hb_vmsh_pushnil()
  %c51b = icmp ne i32 %r51b, 0
  br i1 %c51b, label %seqdb51, label %i54
seqdb51:
  %brkb51 = icmp eq i32 %r51b, 2
  br i1 %brkb51, label %i44, label %seqqb51
seqqb51:
  %qitb51 = icmp eq i32 %r51b, 1
  br i1 %qitb51, label %i44, label %epilogue
i54:
  %r54 = call i32 @hb_vmsh_pushstring(i8* getelementptr([15 x i8], [15 x i8]* @.sl.str.17, i32 0, i32 0), i64 14)
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %seqd54, label %i71
seqd54:
  %brk54 = icmp eq i32 %r54, 2
  br i1 %brk54, label %i44, label %seqq54
seqq54:
  %qit54 = icmp eq i32 %r54, 1
  br i1 %qit54, label %i44, label %epilogue
i71:
  %r71 = call i32 @hb_vmsh_do(i32 1)
  %c71 = icmp ne i32 %r71, 0
  br i1 %c71, label %seqd71, label %i73
seqd71:
  %brk71 = icmp eq i32 %r71, 2
  br i1 %brk71, label %i44, label %seqq71
seqq71:
  %qit71 = icmp eq i32 %r71, 1
  br i1 %qit71, label %i44, label %epilogue
i73:
  %r73 = call i32 @hb_vmsh_alwaysend()
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %seqd73, label %i74
seqd73:
  %brk73 = icmp eq i32 %r73, 2
  br i1 %brk73, label %i81, label %seqq73
seqq73:
  br label %epilogue
i74:
  br label %i77
i77:
  %r77 = call i32 @hb_vmsh_seqend()
  br label %i112
i81:
  br label %i84
i84:
  %r84 = call i32 @hb_vmsh_seqrecover()
  br label %i85
i85:
  %r85 = call i32 @hb_vmsh_pop()
  %c85 = icmp ne i32 %r85, 0
  br i1 %c85, label %epilogue, label %i86
i86:
  br label %i89
i89:
  %r89 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c89 = icmp ne i32 %r89, 0
  br i1 %c89, label %epilogue, label %ipfs89a
ipfs89a:
  %r89b = call i32 @hb_vmsh_pushnil()
  %c89b = icmp ne i32 %r89b, 0
  br i1 %c89b, label %epilogue, label %i92
i92:
  %r92 = call i32 @hb_vmsh_pushstring(i8* getelementptr([16 x i8], [16 x i8]* @.sl.str.18, i32 0, i32 0), i64 15)
  %c92 = icmp ne i32 %r92, 0
  br i1 %c92, label %epilogue, label %i110
i110:
  %r110 = call i32 @hb_vmsh_do(i32 1)
  %c110 = icmp ne i32 %r110, 0
  br i1 %c110, label %epilogue, label %i112
i112:
  br label %i115
i115:
  %r115 = call i32 @hb_vmsh_pushnil()
  %c115 = icmp ne i32 %r115, 0
  br i1 %c115, label %epilogue, label %i116
i116:
  %r116 = call i32 @hb_vmsh_retvalue()
  %c116 = icmp ne i32 %r116, 0
  br i1 %c116, label %epilogue, label %i117
i117:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_TRYCONDBRK() {
entry:
  %jp40 = alloca i32
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushlogical(i32 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_poplocal(i32 1)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  br label %i12
i12:
  %r12 = call i32 @hb_vmsh_seqbegin(i8* getelementptr([109 x i8], [109 x i8]* @.pcode.HB_FUN_TRYCONDBRK, i32 0, i32 76))
  %c12 = icmp ne i32 %r12, 0
  br i1 %c12, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %seqdc19, label %ipfs19a
seqdc19:
  %brkc19 = icmp eq i32 %r19, 2
  br i1 %brkc19, label %i76, label %seqqc19
seqqc19:
  br label %epilogue
ipfs19a:
  %r19b = call i32 @hb_vmsh_pushnil()
  %c19b = icmp ne i32 %r19b, 0
  br i1 %c19b, label %seqdb19, label %i22
seqdb19:
  %brkb19 = icmp eq i32 %r19b, 2
  br i1 %brkb19, label %i76, label %seqqb19
seqqb19:
  br label %epilogue
i22:
  %r22 = call i32 @hb_vmsh_pushstring(i8* getelementptr([9 x i8], [9 x i8]* @.sl.str.19, i32 0, i32 0), i64 8)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %seqd22, label %i33
seqd22:
  %brk22 = icmp eq i32 %r22, 2
  br i1 %brk22, label %i76, label %seqq22
seqq22:
  br label %epilogue
i33:
  %r33 = call i32 @hb_vmsh_do(i32 1)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %seqd33, label %i35
seqd33:
  %brk33 = icmp eq i32 %r33, 2
  br i1 %brk33, label %i76, label %seqq33
seqq33:
  br label %epilogue
i35:
  br label %i38
i38:
  %r38 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c38 = icmp ne i32 %r38, 0
  br i1 %c38, label %seqd38, label %i40
seqd38:
  %brk38 = icmp eq i32 %r38, 2
  br i1 %brk38, label %i76, label %seqq38
seqq38:
  br label %epilogue
i40:
  %rjp40 = call i32 @hb_vmsh_poplogical(i32* %jp40)
  %cjp40 = icmp ne i32 %rjp40, 0
  br i1 %cjp40, label %seqdcjp40, label %jpdone40
seqdcjp40:
  %brkcjp40 = icmp eq i32 %rjp40, 2
  br i1 %brkcjp40, label %i76, label %seqqcjp40
seqqcjp40:
  br label %epilogue
jpdone40:
  %vjp40 = load i32, i32* %jp40
  %bjp40 = icmp ne i32 %vjp40, 0
  br i1 %bjp40, label %i42, label %i50
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 10))
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %seqdc45, label %ipfs45a
seqdc45:
  %brkc45 = icmp eq i32 %r45, 2
  br i1 %brkc45, label %i76, label %seqqc45
seqqc45:
  br label %epilogue
ipfs45a:
  %r45b = call i32 @hb_vmsh_pushnil()
  %c45b = icmp ne i32 %r45b, 0
  br i1 %c45b, label %seqdb45, label %i48
seqdb45:
  %brkb45 = icmp eq i32 %r45b, 2
  br i1 %brkb45, label %i76, label %seqqb45
seqqb45:
  br label %epilogue
i48:
  %r48 = call i32 @hb_vmsh_do(i32 0)
  %c48 = icmp ne i32 %r48, 0
  br i1 %c48, label %seqd48, label %i50
seqd48:
  %brk48 = icmp eq i32 %r48, 2
  br i1 %brk48, label %i76, label %seqq48
seqq48:
  br label %epilogue
i50:
  br label %i53
i53:
  %r53 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %seqdc53, label %ipfs53a
seqdc53:
  %brkc53 = icmp eq i32 %r53, 2
  br i1 %brkc53, label %i76, label %seqqc53
seqqc53:
  br label %epilogue
ipfs53a:
  %r53b = call i32 @hb_vmsh_pushnil()
  %c53b = icmp ne i32 %r53b, 0
  br i1 %c53b, label %seqdb53, label %i56
seqdb53:
  %brkb53 = icmp eq i32 %r53b, 2
  br i1 %brkb53, label %i76, label %seqqb53
seqqb53:
  br label %epilogue
i56:
  %r56 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.20, i32 0, i32 0), i64 11)
  %c56 = icmp ne i32 %r56, 0
  br i1 %c56, label %seqd56, label %i70
seqd56:
  %brk56 = icmp eq i32 %r56, 2
  br i1 %brk56, label %i76, label %seqq56
seqq56:
  br label %epilogue
i70:
  %r70 = call i32 @hb_vmsh_do(i32 1)
  %c70 = icmp ne i32 %r70, 0
  br i1 %c70, label %seqd70, label %i72
seqd70:
  %brk70 = icmp eq i32 %r70, 2
  br i1 %brk70, label %i76, label %seqq70
seqq70:
  br label %epilogue
i72:
  %r72 = call i32 @hb_vmsh_seqend()
  br label %i103
i76:
  br label %i79
i79:
  %r79 = call i32 @hb_vmsh_seqrecover()
  br label %i80
i80:
  %r80 = call i32 @hb_vmsh_pop()
  %c80 = icmp ne i32 %r80, 0
  br i1 %c80, label %epilogue, label %i81
i81:
  br label %i84
i84:
  %r84 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 9))
  %c84 = icmp ne i32 %r84, 0
  br i1 %c84, label %epilogue, label %ipfs84a
ipfs84a:
  %r84b = call i32 @hb_vmsh_pushnil()
  %c84b = icmp ne i32 %r84b, 0
  br i1 %c84b, label %epilogue, label %i87
i87:
  %r87 = call i32 @hb_vmsh_pushstring(i8* getelementptr([12 x i8], [12 x i8]* @.sl.str.21, i32 0, i32 0), i64 11)
  %c87 = icmp ne i32 %r87, 0
  br i1 %c87, label %epilogue, label %i101
i101:
  %r101 = call i32 @hb_vmsh_do(i32 1)
  %c101 = icmp ne i32 %r101, 0
  br i1 %c101, label %epilogue, label %i103
i103:
  br label %i106
i106:
  %r106 = call i32 @hb_vmsh_pushnil()
  %c106 = icmp ne i32 %r106, 0
  br i1 %c106, label %epilogue, label %i107
i107:
  %r107 = call i32 @hb_vmsh_retvalue()
  %c107 = icmp ne i32 %r107, 0
  br i1 %c107, label %epilogue, label %i108
i108:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([12 x %HB_SYMB], [12 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 12,
    i8* getelementptr([24 x i8], [24 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"

Program output

try-normal
after-normal
try-catch-pre
caught
after-catch
inner-pre
caught-cross
inner-caught
after-inner
outer-caught
try-fin-ok
always-ran-ok
try-fin-brk
always-ran-brk
outer-recovered
cond-pre
cond-caught
main done

statics.prg

IR ok run ok SL partial

note: HB_FUN_MAIN fell back to hb_vmExecute (unsupported opcodes)

xBase source

function Main()
   static nCount := 0
   nCount := nCount + 1
   ? nCount
   return nil

LLVM IR (195 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/statics.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_INITLINES()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_STATICS = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [28 x i8] c"\74\03\00\24\03\00\68\01\00\7A\87\24\04\00\B0\02\00\67\01\00\14\01\24\05\00\64\6E\07"
@.pcode.hb_INITSTATICS = internal constant [13 x i8] c"\75\03\00\01\00\74\03\00\79\52\01\00\07"

@.sym.0 = private constant [8 x i8] c"\53\54\41\54\49\43\53\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"
@.sym.3 = private constant [20 x i8] c"\28\5F\49\4E\49\54\53\54\41\54\49\43\53\30\30\30\30\31\29\00"

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

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([8 x i8], [8 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_STATICS 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 },
  %HB_SYMB { i8* getelementptr([20 x i8], [20 x i8]* @.sym.3, i32 0, i32 0),
           i64 536,
           i8* bitcast(void()* @hb_INITSTATICS to i8*),
           i8* null }
]


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

define void @HB_FUN_MAIN() {
  %s = load %HB_SYMB*, %HB_SYMB** @symbols
  call void @hb_vmExecute(i8* getelementptr([28 x i8], [28 x i8]* @.pcode.HB_FUN_MAIN, i32 0, i32 0), %HB_SYMB* %s)
  ret void
}

define void @hb_INITSTATICS() {
  %s = load %HB_SYMB*, %HB_SYMB** @symbols
  call void @hb_vmExecute(i8* getelementptr([13 x i8], [13 x i8]* @.pcode.hb_INITSTATICS, i32 0, i32 0), %HB_SYMB* %s)
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([23 x i8], [23 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"

Program output

         1

switchstmt.prg

IR ok run ok SL ok

straight-line: hb_vmsh_ used, no hb_vmExecute in HB_FUN_MAIN

xBase source

//
// Group F corpus — SWITCH statements straight-lined by the LLVM backend.
//
// The selector is made non-constant with Val() so the compiler emits a real
// HB_P_SWITCH (a constant selector would be folded to a plain JUMP).  Each
// non-default case ends with EXIT — Harbour's SWITCH is C-style fall-through.
//
function Main()
   Classify( Val( "1" ) )
   Classify( Val( "2" ) )
   Classify( Val( "9" ) )
   ClassifyStr( "x" )
   ClassifyStr( "z" )
   return nil

function Classify( n )
   switch n
   case 1
      ? "one"
      exit
   case 2
      ? "two"
      exit
   otherwise
      ? "many"
   end
   return nil

function ClassifyStr( c )
   switch c
   case "x"
      ? "ex"
      exit
   otherwise
      ? "?"
   end
   return nil

LLVM IR (526 lines) download .ll

; Harbour LLVM IR - generated from tests/llvm/switchstmt.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_VAL()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_SWITCHSTMT = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [81 x i8] c"\24\09\00\B0\02\00\B0\03\00\6A\02\31\00\0C\01\14\01\24\0A\00\B0\02\00\B0\03\00\6A\02\32\00\0C\01\14\01\24\0B\00\B0\02\00\B0\03\00\6A\02\39\00\0C\01\14\01\24\0C\00\B0\04\00\6A\02\78\00\14\01\24\0D\00\B0\04\00\6A\02\7A\00\14\01\24\0E\00\64\6E\07"
@.pcode.HB_FUN_CLASSIFY = internal constant [85 x i8] c"\0D\00\01\24\11\00\19\33\24\13\00\B0\05\00\6A\04\6F\6E\65\00\14\01\19\39\24\16\00\B0\05\00\6A\04\74\77\6F\00\14\01\19\29\24\19\00\B0\05\00\6A\05\6D\61\6E\79\00\14\01\19\18\5F\01\85\03\00\61\01\00\00\00\19\C5\61\02\00\00\00\19\CE\64\19\DB\24\1B\00\64\6E\07"
@.pcode.HB_FUN_CLASSIFYSTR = internal constant [57 x i8] c"\0D\00\01\24\1E\00\19\1F\24\20\00\B0\05\00\6A\03\65\78\00\14\01\19\1E\24\23\00\B0\05\00\6A\02\3F\00\14\01\19\10\5F\01\85\02\00\6A\02\78\00\19\DA\64\19\E6\24\25\00\64\6E\07"

@.sym.0 = private constant [11 x i8] c"\53\57\49\54\43\48\53\54\4D\54\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [9 x i8] c"\43\4C\41\53\53\49\46\59\00"
@.sym.3 = private constant [4 x i8] c"\56\41\4C\00"
@.sym.4 = private constant [12 x i8] c"\43\4C\41\53\53\49\46\59\53\54\52\00"
@.sym.5 = private constant [5 x i8] c"\51\4F\55\54\00"

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

@symbols_table = internal global [6 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([11 x i8], [11 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_SWITCHSTMT 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([9 x i8], [9 x i8]* @.sym.2, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_CLASSIFY to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([4 x i8], [4 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_VAL to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([12 x i8], [12 x i8]* @.sym.4, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_CLASSIFYSTR to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.5, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]

@.sl.str.0 = private constant [2 x i8] c"\31\00"
@.sl.str.1 = private constant [2 x i8] c"\32\00"
@.sl.str.2 = private constant [2 x i8] c"\39\00"
@.sl.str.3 = private constant [2 x i8] c"\78\00"
@.sl.str.4 = private constant [2 x i8] c"\7A\00"
@.sl.str.5 = private constant [4 x i8] c"\6F\6E\65\00"
@.sl.str.6 = private constant [4 x i8] c"\74\77\6F\00"
@.sl.str.7 = private constant [5 x i8] c"\6D\61\6E\79\00"
@.sl.str.8 = private constant [3 x i8] c"\65\78\00"
@.sl.str.9 = private constant [2 x i8] c"\3F\00"

define void @HB_FUN_SWITCHSTMT() {
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([6 x %HB_SYMB], [6 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_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %ipfs6a
ipfs6a:
  %r6b = call i32 @hb_vmsh_pushnil()
  %c6b = icmp ne i32 %r6b, 0
  br i1 %c6b, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.0, i32 0, i32 0), i64 1)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i13
i13:
  %r13 = call i32 @hb_vmsh_function(i32 1)
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i15
i15:
  %r15 = call i32 @hb_vmsh_do(i32 1)
  %c15 = icmp ne i32 %r15, 0
  br i1 %c15, label %epilogue, label %i17
i17:
  br label %i20
i20:
  %r20 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c20 = icmp ne i32 %r20, 0
  br i1 %c20, label %epilogue, label %ipfs20a
ipfs20a:
  %r20b = call i32 @hb_vmsh_pushnil()
  %c20b = icmp ne i32 %r20b, 0
  br i1 %c20b, label %epilogue, label %i23
i23:
  %r23 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c23 = icmp ne i32 %r23, 0
  br i1 %c23, label %epilogue, label %ipfs23a
ipfs23a:
  %r23b = call i32 @hb_vmsh_pushnil()
  %c23b = icmp ne i32 %r23b, 0
  br i1 %c23b, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.1, i32 0, i32 0), i64 1)
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_function(i32 1)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i32
i32:
  %r32 = call i32 @hb_vmsh_do(i32 1)
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %i34
i34:
  br label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %ipfs37a
ipfs37a:
  %r37b = call i32 @hb_vmsh_pushnil()
  %c37b = icmp ne i32 %r37b, 0
  br i1 %c37b, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %ipfs40a
ipfs40a:
  %r40b = call i32 @hb_vmsh_pushnil()
  %c40b = icmp ne i32 %r40b, 0
  br i1 %c40b, label %epilogue, label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.2, i32 0, i32 0), i64 1)
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %i47
i47:
  %r47 = call i32 @hb_vmsh_function(i32 1)
  %c47 = icmp ne i32 %r47, 0
  br i1 %c47, label %epilogue, label %i49
i49:
  %r49 = call i32 @hb_vmsh_do(i32 1)
  %c49 = icmp ne i32 %r49, 0
  br i1 %c49, label %epilogue, label %i51
i51:
  br label %i54
i54:
  %r54 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %ipfs54a
ipfs54a:
  %r54b = call i32 @hb_vmsh_pushnil()
  %c54b = icmp ne i32 %r54b, 0
  br i1 %c54b, label %epilogue, label %i57
i57:
  %r57 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.3, i32 0, i32 0), i64 1)
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %i61
i61:
  %r61 = call i32 @hb_vmsh_do(i32 1)
  %c61 = icmp ne i32 %r61, 0
  br i1 %c61, label %epilogue, label %i63
i63:
  br label %i66
i66:
  %r66 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 4))
  %c66 = icmp ne i32 %r66, 0
  br i1 %c66, label %epilogue, label %ipfs66a
ipfs66a:
  %r66b = call i32 @hb_vmsh_pushnil()
  %c66b = icmp ne i32 %r66b, 0
  br i1 %c66b, label %epilogue, label %i69
i69:
  %r69 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.4, i32 0, i32 0), i64 1)
  %c69 = icmp ne i32 %r69, 0
  br i1 %c69, label %epilogue, label %i73
i73:
  %r73 = call i32 @hb_vmsh_do(i32 1)
  %c73 = icmp ne i32 %r73, 0
  br i1 %c73, label %epilogue, label %i75
i75:
  br label %i78
i78:
  %r78 = call i32 @hb_vmsh_pushnil()
  %c78 = icmp ne i32 %r78, 0
  br i1 %c78, label %epilogue, label %i79
i79:
  %r79 = call i32 @hb_vmsh_retvalue()
  %c79 = icmp ne i32 %r79, 0
  br i1 %c79, label %epilogue, label %i80
i80:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_CLASSIFY() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  br label %i57
i8:
  br label %i11
i11:
  %r11 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %ipfs11a
ipfs11a:
  %r11b = call i32 @hb_vmsh_pushnil()
  %c11b = icmp ne i32 %r11b, 0
  br i1 %c11b, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.5, i32 0, i32 0), i64 3)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, 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 %i79
i24:
  br label %i27
i27:
  %r27 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %ipfs27a
ipfs27a:
  %r27b = call i32 @hb_vmsh_pushnil()
  %c27b = icmp ne i32 %r27b, 0
  br i1 %c27b, label %epilogue, label %i30
i30:
  %r30 = call i32 @hb_vmsh_pushstring(i8* getelementptr([4 x i8], [4 x i8]* @.sl.str.6, i32 0, i32 0), i64 3)
  %c30 = icmp ne i32 %r30, 0
  br i1 %c30, label %epilogue, label %i36
i36:
  %r36 = call i32 @hb_vmsh_do(i32 1)
  %c36 = icmp ne i32 %r36, 0
  br i1 %c36, label %epilogue, label %i38
i38:
  br label %i79
i40:
  br label %i43
i43:
  %r43 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c43 = icmp ne i32 %r43, 0
  br i1 %c43, label %epilogue, label %ipfs43a
ipfs43a:
  %r43b = call i32 @hb_vmsh_pushnil()
  %c43b = icmp ne i32 %r43b, 0
  br i1 %c43b, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_pushstring(i8* getelementptr([5 x i8], [5 x i8]* @.sl.str.7, i32 0, i32 0), i64 4)
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i53
i53:
  %r53 = call i32 @hb_vmsh_do(i32 1)
  %c53 = icmp ne i32 %r53, 0
  br i1 %c53, label %epilogue, label %i55
i55:
  br label %i79
i57:
  %r57 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c57 = icmp ne i32 %r57, 0
  br i1 %c57, label %epilogue, label %i59
i59:
  %r59 = call i32 @hb_vmsh_switchidx(i8* getelementptr([85 x i8], [85 x i8]* @.pcode.HB_FUN_CLASSIFY, i32 0, i32 62), i32 3)
  switch i32 %r59, label %i79 [
    i32 0, label %i8
    i32 1, label %i24
    i32 2, label %i40
  ]
i79:
  br label %i82
i82:
  %r82 = call i32 @hb_vmsh_pushnil()
  %c82 = icmp ne i32 %r82, 0
  br i1 %c82, label %epilogue, label %i83
i83:
  %r83 = call i32 @hb_vmsh_retvalue()
  %c83 = icmp ne i32 %r83, 0
  br i1 %c83, label %epilogue, label %i84
i84:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_CLASSIFYSTR() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  br label %i37
i8:
  br label %i11
i11:
  %r11 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %ipfs11a
ipfs11a:
  %r11b = call i32 @hb_vmsh_pushnil()
  %c11b = icmp ne i32 %r11b, 0
  br i1 %c11b, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_pushstring(i8* getelementptr([3 x i8], [3 x i8]* @.sl.str.8, i32 0, i32 0), i64 2)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i19
i19:
  %r19 = call i32 @hb_vmsh_do(i32 1)
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %i21
i21:
  br label %i51
i23:
  br label %i26
i26:
  %r26 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 5))
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %ipfs26a
ipfs26a:
  %r26b = call i32 @hb_vmsh_pushnil()
  %c26b = icmp ne i32 %r26b, 0
  br i1 %c26b, label %epilogue, label %i29
i29:
  %r29 = call i32 @hb_vmsh_pushstring(i8* getelementptr([2 x i8], [2 x i8]* @.sl.str.9, i32 0, i32 0), i64 1)
  %c29 = icmp ne i32 %r29, 0
  br i1 %c29, label %epilogue, label %i33
i33:
  %r33 = call i32 @hb_vmsh_do(i32 1)
  %c33 = icmp ne i32 %r33, 0
  br i1 %c33, label %epilogue, label %i35
i35:
  br label %i51
i37:
  %r37 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_switchidx(i8* getelementptr([57 x i8], [57 x i8]* @.pcode.HB_FUN_CLASSIFYSTR, i32 0, i32 42), i32 2)
  switch i32 %r39, label %i51 [
    i32 0, label %i8
    i32 1, label %i23
  ]
i51:
  br label %i54
i54:
  %r54 = call i32 @hb_vmsh_pushnil()
  %c54 = icmp ne i32 %r54, 0
  br i1 %c54, label %epilogue, label %i55
i55:
  %r55 = call i32 @hb_vmsh_retvalue()
  %c55 = icmp ne i32 %r55, 0
  br i1 %c55, label %epilogue, label %i56
i56:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([6 x %HB_SYMB], [6 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 6,
    i8* getelementptr([26 x i8], [26 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"

Program output

one
two
many
ex
?