Index: src/invocation/invoke-x86_64.m ================================================================== --- src/invocation/invoke-x86_64.m +++ src/invocation/invoke-x86_64.m @@ -41,16 +41,16 @@ RETURN_TYPE_JMP, RETURN_TYPE_JMP_STRET }; struct call_context { - uint64_t gpr[NUM_GPR_IN + NUM_GPR_OUT]; - __m128 sse[NUM_SSE_IN]; - long double x87[NUM_X87_OUT]; - uint8_t num_sse_used; - uint8_t return_type; - uint64_t stack_size; + uint64_t GPR[NUM_GPR_IN + NUM_GPR_OUT]; + __m128 SSE[NUM_SSE_IN]; + long double X87[NUM_X87_OUT]; + uint8_t numSSEUsed; + uint8_t returnType; + uint64_t stackSize; uint64_t stack[]; }; extern void of_invocation_call(struct call_context *); @@ -58,23 +58,23 @@ pushGPR(struct call_context **context, uint_fast8_t *currentGPR, uint64_t value) { struct call_context *newContext; if (*currentGPR < NUM_GPR_IN) { - (*context)->gpr[(*currentGPR)++] = value; + (*context)->GPR[(*currentGPR)++] = value; return; } if ((newContext = realloc(*context, - sizeof(**context) + ((*context)->stack_size + 1) * 8)) == NULL) { + sizeof(**context) + ((*context)->stackSize + 1) * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: - sizeof(**context) + ((*context)->stack_size + 1) * 8]; + sizeof(**context) + ((*context)->stackSize + 1) * 8]; } - newContext->stack[newContext->stack_size] = value; - newContext->stack_size++; + newContext->stack[newContext->stackSize] = value; + newContext->stackSize++; *context = newContext; } static void pushDouble(struct call_context **context, uint_fast8_t *currentSSE, @@ -81,24 +81,24 @@ double value) { struct call_context *newContext; if (*currentSSE < NUM_SSE_IN) { - (*context)->sse[(*currentSSE)++] = (__m128)_mm_set_sd(value); - (*context)->num_sse_used++; + (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(value); + (*context)->numSSEUsed++; return; } if ((newContext = realloc(*context, - sizeof(**context) + ((*context)->stack_size + 1) * 8)) == NULL) { + sizeof(**context) + ((*context)->stackSize + 1) * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: - sizeof(**context) + ((*context)->stack_size + 1) * 8]; + sizeof(**context) + ((*context)->stackSize + 1) * 8]; } - memcpy(&newContext->stack[newContext->stack_size], &value, 8); - newContext->stack_size++; + memcpy(&newContext->stack[newContext->stackSize], &value, 8); + newContext->stackSize++; *context = newContext; } static void pushQuad(struct call_context **context, uint_fast8_t *currentSSE, @@ -106,69 +106,69 @@ { size_t stackSize; struct call_context *newContext; if (*currentSSE + 1 < NUM_SSE_IN) { - (*context)->sse[(*currentSSE)++] = (__m128)_mm_set_sd(low); - (*context)->sse[(*currentSSE)++] = (__m128)_mm_set_sd(high); - (*context)->num_sse_used += 2; + (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(low); + (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(high); + (*context)->numSSEUsed += 2; return; } - stackSize = (*context)->stack_size + 2; + stackSize = (*context)->stackSize + 2; if ((newContext = realloc(*context, sizeof(**context) + stackSize * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: sizeof(**context) + stackSize * 8]; } - memset(&newContext->stack[newContext->stack_size], '\0', - (stackSize - newContext->stack_size) * 8); + memset(&newContext->stack[newContext->stackSize], '\0', + (stackSize - newContext->stackSize) * 8); memcpy(&newContext->stack[stackSize - 2], &low, 8); memcpy(&newContext->stack[stackSize - 1], &high, 8); - newContext->stack_size = stackSize; + newContext->stackSize = stackSize; *context = newContext; } static void pushLongDouble(struct call_context **context, long double value) { struct call_context *newContext; if ((newContext = realloc(*context, - sizeof(**context) + ((*context)->stack_size + 2) * 8)) == NULL) { + sizeof(**context) + ((*context)->stackSize + 2) * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: - sizeof(**context) + ((*context)->stack_size + 2) * 8]; + sizeof(**context) + ((*context)->stackSize + 2) * 8]; } - memcpy(&newContext->stack[newContext->stack_size], &value, 16); - newContext->stack_size += 2; + memcpy(&newContext->stack[newContext->stackSize], &value, 16); + newContext->stackSize += 2; *context = newContext; } static void pushLongDoublePair(struct call_context **context, long double value[2]) { size_t stackSize; struct call_context *newContext; - stackSize = OF_ROUND_UP_POW2(2, (*context)->stack_size) + 4; + stackSize = OF_ROUND_UP_POW2(2, (*context)->stackSize) + 4; if ((newContext = realloc(*context, sizeof(**context) + stackSize * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: sizeof(**context) + stackSize * 8]; } - memset(&newContext->stack[newContext->stack_size], '\0', - (stackSize - newContext->stack_size) * 8); + memset(&newContext->stack[newContext->stackSize], '\0', + (stackSize - newContext->stackSize) * 8); memcpy(&newContext->stack[stackSize - 4], value, 32); - newContext->stack_size = stackSize; + newContext->stackSize = stackSize; *context = newContext; } #if defined(__SIZEOF_INT128__) && !defined(__clang__) static void @@ -177,28 +177,28 @@ { size_t stackSize; struct call_context *newContext; if (*currentGPR + 1 < NUM_GPR_IN) { - (*context)->gpr[(*currentGPR)++] = value[0]; - (*context)->gpr[(*currentGPR)++] = value[1]; + (*context)->GPR[(*currentGPR)++] = value[0]; + (*context)->GPR[(*currentGPR)++] = value[1]; return; } - stackSize = OF_ROUND_UP_POW2(2, (*context)->stack_size) + 2; + stackSize = OF_ROUND_UP_POW2(2, (*context)->stackSize) + 2; if ((newContext = realloc(*context, sizeof(**context) + stackSize * 8)) == NULL) { free(*context); @throw [OFOutOfMemoryException exceptionWithRequestedSize: sizeof(**context) + stackSize * 8]; } - memset(&newContext->stack[newContext->stack_size], '\0', - (stackSize - newContext->stack_size) * 8); + memset(&newContext->stack[newContext->stackSize], '\0', + (stackSize - newContext->stackSize) * 8); memcpy(&newContext->stack[stackSize - 2], value, 16); - newContext->stack_size = stackSize; + newContext->stackSize = stackSize; *context = newContext; } #endif void @@ -218,18 +218,18 @@ if (*typeEncoding == 'r') typeEncoding++; switch (*typeEncoding) { -#define CASE_GPR(encoding, type) \ - case encoding: \ - { \ - type tmp; \ - [invocation getArgument: &tmp \ - atIndex: i]; \ - pushGPR(&context, ¤tGPR, tmp); \ - } \ +#define CASE_GPR(encoding, type) \ + case encoding: \ + { \ + type tmp; \ + [invocation getArgument: &tmp \ + atIndex: i]; \ + pushGPR(&context, ¤tGPR, (uint64_t)tmp); \ + } \ break; CASE_GPR('c', char) CASE_GPR('C', unsigned char) CASE_GPR('i', int) CASE_GPR('I', unsigned int) @@ -238,15 +238,20 @@ CASE_GPR('l', long) CASE_GPR('L', unsigned long) CASE_GPR('q', long long) CASE_GPR('Q', unsigned long long) CASE_GPR('B', _Bool) - CASE_GPR('*', uintptr_t) - CASE_GPR('@', uintptr_t) - CASE_GPR('#', uintptr_t) - CASE_GPR(':', uintptr_t) - CASE_GPR('^', uintptr_t) + CASE_GPR('*', char *) + CASE_GPR('@', id) + CASE_GPR('#', Class) + /* + * Using SEL triggers a warning that casting a SEL to an + * integer is deprecated. + */ + CASE_GPR(':', void *) + CASE_GPR('^', void *) +#undef CASE_GPR #ifdef __SIZEOF_INT128__ case 't': case 'T':; uint64_t int128Tmp[2]; [invocation getArgument: &int128Tmp @@ -313,11 +318,10 @@ /* TODO: '{' */ /* TODO: '(' */ default: free(context); @throw [OFInvalidFormatException exception]; -#undef CASE_GPR } } typeEncoding = [methodSignature methodReturnType]; @@ -345,24 +349,24 @@ case 't': case 'T': #endif case 'f': case 'd': - context->return_type = RETURN_TYPE_NORMAL; + context->returnType = RETURN_TYPE_NORMAL; break; case 'D': - context->return_type = RETURN_TYPE_X87; + context->returnType = RETURN_TYPE_X87; break; #ifndef __STDC_NO_COMPLEX__ case 'j': switch (typeEncoding[1]) { case 'f': case 'd': - context->return_type = RETURN_TYPE_NORMAL; + context->returnType = RETURN_TYPE_NORMAL; break; case 'D': - context->return_type = RETURN_TYPE_COMPLEX_X87; + context->returnType = RETURN_TYPE_COMPLEX_X87; break; default: free(context); @throw [OFInvalidFormatException exception]; } @@ -381,11 +385,11 @@ switch (*typeEncoding) { #define CASE_GPR(encoding, type) \ case encoding: \ { \ - type tmp = (type)context->gpr[NUM_GPR_IN]; \ + type tmp = (type)context->GPR[NUM_GPR_IN]; \ [invocation setReturnValue: &tmp]; \ } \ break; CASE_GPR('c', char) CASE_GPR('C', unsigned char) @@ -396,53 +400,54 @@ CASE_GPR('l', long) CASE_GPR('L', unsigned long) CASE_GPR('q', long long) CASE_GPR('Q', unsigned long long) CASE_GPR('B', _Bool) - CASE_GPR('*', uintptr_t) - CASE_GPR('@', uintptr_t) - CASE_GPR('#', uintptr_t) - CASE_GPR(':', uintptr_t) - CASE_GPR('^', uintptr_t) + CASE_GPR('*', char *) + CASE_GPR('@', id) + CASE_GPR('#', Class) + CASE_GPR(':', SEL) + CASE_GPR('^', void *) +#undef CASE_GPR #ifdef __SIZEOF_INT128__ case 't': case 'T':; - [invocation setReturnValue: &context->gpr[NUM_GPR_IN]]; + [invocation setReturnValue: &context->GPR[NUM_GPR_IN]]; break; #endif case 'f':; float floatTmp; - _mm_store_ss(&floatTmp, context->sse[0]); + _mm_store_ss(&floatTmp, context->SSE[0]); [invocation setReturnValue: &floatTmp]; break; case 'd':; double doubleTmp; - _mm_store_sd(&doubleTmp, (__m128d)context->sse[0]); + _mm_store_sd(&doubleTmp, (__m128d)context->SSE[0]); [invocation setReturnValue: &doubleTmp]; break; case 'D': - [invocation setReturnValue: &context->x87[0]]; + [invocation setReturnValue: &context->X87[0]]; break; #ifndef __STDC_NO_COMPLEX__ case 'j': switch (typeEncoding[1]) { case 'f':; double complexFloatTmp; _mm_store_sd(&complexFloatTmp, - (__m128d)context->sse[0]); + (__m128d)context->SSE[0]); [invocation setReturnValue: &complexFloatTmp]; break; case 'd':; double complexDoubleTmp[2]; _mm_store_sd(&complexDoubleTmp[0], - (__m128d)context->sse[0]); + (__m128d)context->SSE[0]); _mm_store_sd(&complexDoubleTmp[1], - (__m128d)context->sse[1]); + (__m128d)context->SSE[1]); [invocation setReturnValue: &complexDoubleTmp]; break; case 'D': - [invocation setReturnValue: context->x87]; + [invocation setReturnValue: context->X87]; break; default: free(context); @throw [OFInvalidFormatException exception]; } @@ -453,10 +458,9 @@ /* TODO: '{' */ /* TODO: '(' */ default: free(context); @throw [OFInvalidFormatException exception]; -#undef CASE_GPR } free(context); }