From 1c48da2075a5eb3886a3ad8b178e92398a51e6a3 Mon Sep 17 00:00:00 2001 From: fedor Date: Tue, 9 Feb 1999 05:13:34 +0000 Subject: [PATCH] New copies of generic git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@3672 72102866-910b-0410-8b05-ffd578937521 --- Source/mframe/i386/freebsd | 48 ++++++++++++++++++++++++++++++++++++++ Source/mframe/i386/openbsd | 48 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 Source/mframe/i386/freebsd create mode 100644 Source/mframe/i386/openbsd diff --git a/Source/mframe/i386/freebsd b/Source/mframe/i386/freebsd new file mode 100644 index 000000000..727429198 --- /dev/null +++ b/Source/mframe/i386/freebsd @@ -0,0 +1,48 @@ +/* See ../README for copyright */ + +#define MFRAME_STACK_STRUCT 0 +#define MFRAME_STRUCT_BYREF 0 +#define MFRAME_SMALL_STRUCT 0 +#define MFRAME_ARGS_SIZE 8 +#define MFRAME_RESULT_SIZE 116 + +#define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) \ +((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? \ + *(void**)((ARGS)->arg_regs + sizeof(void*)) : (void*)0) + +#define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) \ +({if (*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) \ + *(void**)((ARGS)->arg_regs + sizeof(void*)) = (ADDR);}) + +#define MFRAME_ARGS int + +#define MFRAME_INIT_ARGS(CUM, RTYPE) \ +((CUM) = (*(RTYPE)==_C_STRUCT_B || *(RTYPE)==_C_UNION_B || \ + *(RTYPE)==_C_ARY_B) ? sizeof(void*) : 0) + +#define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) \ +({ \ + const char* type = (TYPE); \ + int align = objc_alignof_type(type); \ + int size = objc_sizeof_type(type); \ +\ + (CUM) = ROUND((CUM), align); \ + (TYPE) = objc_skip_typespec(type); \ + sprintf((DEST), "%.*s%d", (TYPE)-type, type, (CUM)); \ + if (*(TYPE) == '+') (TYPE)++; \ + while (isdigit(*(TYPE))) \ + { \ + (TYPE)++; \ + } \ + (DEST)=&(DEST)[strlen(DEST)]; \ + if ((*type==_C_STRUCT_B||*type==_C_UNION_B||*type==_C_ARY_B)&&size>2) \ + { \ + (STACK) = (CUM) + ROUND(size, align); \ + } \ + else \ + { \ + (STACK) = (CUM) + size; \ + } \ + (CUM) += ROUND(size, sizeof(void*)); \ +}) + diff --git a/Source/mframe/i386/openbsd b/Source/mframe/i386/openbsd new file mode 100644 index 000000000..727429198 --- /dev/null +++ b/Source/mframe/i386/openbsd @@ -0,0 +1,48 @@ +/* See ../README for copyright */ + +#define MFRAME_STACK_STRUCT 0 +#define MFRAME_STRUCT_BYREF 0 +#define MFRAME_SMALL_STRUCT 0 +#define MFRAME_ARGS_SIZE 8 +#define MFRAME_RESULT_SIZE 116 + +#define MFRAME_GET_STRUCT_ADDR(ARGS, TYPES) \ +((*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) ? \ + *(void**)((ARGS)->arg_regs + sizeof(void*)) : (void*)0) + +#define MFRAME_SET_STRUCT_ADDR(ARGS, TYPES, ADDR) \ +({if (*(TYPES)==_C_STRUCT_B || *(TYPES)==_C_UNION_B || *(TYPES)==_C_ARY_B) \ + *(void**)((ARGS)->arg_regs + sizeof(void*)) = (ADDR);}) + +#define MFRAME_ARGS int + +#define MFRAME_INIT_ARGS(CUM, RTYPE) \ +((CUM) = (*(RTYPE)==_C_STRUCT_B || *(RTYPE)==_C_UNION_B || \ + *(RTYPE)==_C_ARY_B) ? sizeof(void*) : 0) + +#define MFRAME_ARG_ENCODING(CUM, TYPE, STACK, DEST) \ +({ \ + const char* type = (TYPE); \ + int align = objc_alignof_type(type); \ + int size = objc_sizeof_type(type); \ +\ + (CUM) = ROUND((CUM), align); \ + (TYPE) = objc_skip_typespec(type); \ + sprintf((DEST), "%.*s%d", (TYPE)-type, type, (CUM)); \ + if (*(TYPE) == '+') (TYPE)++; \ + while (isdigit(*(TYPE))) \ + { \ + (TYPE)++; \ + } \ + (DEST)=&(DEST)[strlen(DEST)]; \ + if ((*type==_C_STRUCT_B||*type==_C_UNION_B||*type==_C_ARY_B)&&size>2) \ + { \ + (STACK) = (CUM) + ROUND(size, align); \ + } \ + else \ + { \ + (STACK) = (CUM) + size; \ + } \ + (CUM) += ROUND(size, sizeof(void*)); \ +}) +