mirror of
git://c9x.me/qbe.git
synced 2026-04-05 09:59:47 +00:00
This is an implementation of the Windows ABI. It supports most features (struct passing/returning, varargs, env). TLS is not yet supported. This patch does not actually port QBE to Windows, it only allows QBE to generate correct asm to target Windows. As a result, testing is accomplished on a Linux host, by using a cross-compiling toolchain, and running the resulting binaries by using wine. See: TARGET=amd64_win tools/test.sh all A few cross-platform tests were changed from 'long' to 'long long' in driver code because long in C does not match the size of a QBE 'l' on Windows.
33 lines
643 B
Plaintext
33 lines
643 B
Plaintext
# skip arm64 arm64_apple rv64 amd64_win
|
|
# a hack example,
|
|
# we use a dark type to get
|
|
# a pointer to the stack.
|
|
|
|
type :magic = align 1 { 0 }
|
|
|
|
data $ret = { l 0 }
|
|
|
|
export
|
|
function $test(:magic %p) {
|
|
@start
|
|
%av =w loadw $a
|
|
%a1 =w add 1, %av
|
|
storew %a1, $a # increment $a
|
|
%r1 =l loadl $ret # fetch from $ret
|
|
%p1 =l add %p, -8
|
|
%r2 =l loadl %p1 # get the return address
|
|
storel %r2, $ret # store it in $ret
|
|
%c =w ceql %r1, %r2
|
|
jnz %c, @fin, @cal
|
|
@cal
|
|
%i =w call $test() # no argument given, intentionally!
|
|
@fin
|
|
ret
|
|
}
|
|
|
|
# >>> driver
|
|
# extern void test(void);
|
|
# int a = 2;
|
|
# int main() { test(); return !(a == 5); }
|
|
# <<<
|