Skip to content

Instantly share code, notes, and snippets.

@dlrobertson
Last active November 2, 2018 20:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dlrobertson/51bdc6bb2dea8d65967d6fba4f5f58dd to your computer and use it in GitHub Desktop.
Save dlrobertson/51bdc6bb2dea8d65967d6fba4f5f58dd to your computer and use it in GitHub Desktop.
Hacky LLVM va_arg test
CC ?= clang
LLC ?= llc
all: test
test: va_arg_test
./va_arg_test
clean:
rm raw_va_arg.o va_arg_test
raw_va_arg.o: raw_va_arg.ll
$(LLC) -O0 -filetype=obj -o $@ $<
va_arg_test: va_arg_test.c raw_va_arg.o
$(CC) -g -O0 -m32 -o $@ $< raw_va_arg.o
target triple = "i686-w64-windows-gnu"
define i32 @va_arg_int(i8** %ap) {
%tmp = va_arg i8** %ap, i32
ret i32 %tmp
}
define i64 @va_arg_long(i8** %ap) {
%tmp = va_arg i8** %ap, i64
ret i64 %tmp
}
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
extern int va_arg_int(char** ap);
extern long long va_arg_long(char** ap);
long long va_arg_test_c(int argc, ...) {
va_list ap;
va_start(ap, argc);
long long x = va_arg(ap, long long);
int y = va_arg(ap, int);
long long z = va_arg(ap, long long);
return x + (long long)y + z;
}
int va_arg_test_llvm(int argc, ...) {
va_list ap;
va_start(ap, argc);
long long x = va_arg_long(&ap);
int y = va_arg_int(&ap);
long long z = va_arg_long(&ap);
va_end(ap);
return x + (long long)y + z;
}
int main() {
assert(va_arg_test_c(3, 0x01LL, 0x02, 0x03LL) == 6);
assert(va_arg_test_llvm(3, 0x01LL, 0x02, 0x03LL) == 6);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment