Found a variadic function using _Printf

This commit is contained in:
Ryan Myers
2021-09-19 15:24:47 -04:00
parent db4eed23a2
commit 0d0d8d9c1f
4 changed files with 52 additions and 31 deletions
+42
View File
@@ -0,0 +1,42 @@
#ifndef STDARG_H
#define STDARG_H
// When not building with IDO, use the builtin vaarg macros for portability.
#ifndef __sgi
#define va_list __builtin_va_list
#define va_start __builtin_va_start
#define va_arg __builtin_va_arg
#define va_end __builtin_va_end
#else
typedef char *va_list;
#define _FP 1
#define _INT 0
#define _STRUCT 2
#define _VA_FP_SAVE_AREA 0x10
#define _VA_ALIGN(p, a) (((unsigned int)(((char *)p) + ((a) > 4 ? (a) : 4) - 1)) & -((a) > 4 ? (a) : 4))
#define va_start(vp, parmN) (vp = ((va_list)&parmN + sizeof(parmN)))
#define __va_stack_arg(list, mode) \
( \
((list) = (char *)_VA_ALIGN(list, __builtin_alignof(mode)) + \
_VA_ALIGN(sizeof(mode), 4)), \
(((char *)list) - (_VA_ALIGN(sizeof(mode), 4) - sizeof(mode))))
#define __va_double_arg(list, mode) \
( \
(((long)list & 0x1) /* 1 byte aligned? */ \
? (list = (char *)((long)list + 7), (char *)((long)list - 6 - _VA_FP_SAVE_AREA)) \
: (((long)list & 0x2) /* 2 byte aligned? */ \
? (list = (char *)((long)list + 10), (char *)((long)list - 24 - _VA_FP_SAVE_AREA)) \
: __va_stack_arg(list, mode))))
#define va_arg(list, mode) ((mode *)(((__builtin_classof(mode) == _FP && \
__builtin_alignof(mode) == sizeof(double)) \
? __va_double_arg(list, mode) \
: __va_stack_arg(list, mode))))[-1]
#define va_end(__list)
#endif
#endif
@@ -1,7 +0,0 @@
glabel func_800C9D40
/* 0CA940 800C9D40 AFA40000 */ sw $a0, ($sp)
/* 0CA944 800C9D44 AFA50004 */ sw $a1, 4($sp)
/* 0CA948 800C9D48 AFA60008 */ sw $a2, 8($sp)
/* 0CA94C 800C9D4C 03E00008 */ jr $ra
/* 0CA950 800C9D50 24020001 */ li $v0, 1
@@ -1,22 +0,0 @@
glabel func_800C9D54
/* 0CA954 800C9D54 27BDFFE0 */ addiu $sp, $sp, -0x20
/* 0CA958 800C9D58 AFA40020 */ sw $a0, 0x20($sp)
/* 0CA95C 800C9D5C AFBF0014 */ sw $ra, 0x14($sp)
/* 0CA960 800C9D60 AFA50024 */ sw $a1, 0x24($sp)
/* 0CA964 800C9D64 AFA60028 */ sw $a2, 0x28($sp)
/* 0CA968 800C9D68 AFA7002C */ sw $a3, 0x2c($sp)
/* 0CA96C 800C9D6C 3C04800D */ lui $a0, %hi(func_800C9D40) # $a0, 0x800d
/* 0CA970 800C9D70 24849D40 */ addiu $a0, %lo(func_800C9D40) # addiu $a0, $a0, -0x62c0
/* 0CA974 800C9D74 27A70024 */ addiu $a3, $sp, 0x24
/* 0CA978 800C9D78 8FA60020 */ lw $a2, 0x20($sp)
/* 0CA97C 800C9D7C 0C034FC4 */ jal _Printf
/* 0CA980 800C9D80 00002825 */ move $a1, $zero
/* 0CA984 800C9D84 8FBF0014 */ lw $ra, 0x14($sp)
/* 0CA988 800C9D88 27BD0020 */ addiu $sp, $sp, 0x20
/* 0CA98C 800C9D8C 03E00008 */ jr $ra
/* 0CA990 800C9D90 00000000 */ nop
/* 0CA994 800C9D94 00000000 */ nop
/* 0CA998 800C9D98 00000000 */ nop
/* 0CA99C 800C9D9C 00000000 */ nop
+10 -2
View File
@@ -3,6 +3,14 @@
#include "types.h"
#include "macros.h"
#include "stdarg.h"
GLOBAL_ASM("lib/asm/non_matchings/unknown_0CA940/func_800C9D40.s")
GLOBAL_ASM("lib/asm/non_matchings/unknown_0CA940/func_800C9D54.s")
s32 get_true(s32 arg0, s32 arg1, s32 arg2) {
return TRUE;
}
void func_800C9D54(const char *format, ...) {
va_list args;
va_start(args, format);
_Printf(get_true, 0, format, args);
}