1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Target-specific optimization and run-time hints
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "Dalvik.h"
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "libdex/DexClass.h"
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdlib.h>
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stddef.h>
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <sys/stat.h>
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The class loader will associate with each method a 32-bit info word
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (jniArgInfo) to support JNI calls.  The high order 4 bits of this word
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are the same for all targets, while the lower 28 are used for hints to
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * allow accelerated JNI bridge transfers.
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * jniArgInfo (32-bit int) layout:
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    SRRRHHHH HHHHHHHH HHHHHHHH HHHHHHHH
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    S - if set, ignore the hints and do things the hard way (scan signature)
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    R - return-type enumeration
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *    H - target-specific hints (see below for details)
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This function produces x86-specific hints for the standard 32-bit 386 ABI.
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note that the JNI requirements are very close to the 386 runtime model.  In
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * particular, natural datatype alignments do not apply to passed arguments.
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * All arguments have 32-bit alignment.  As a result, we don't have to worry
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * about padding - just total size.  The only tricky bit is that floating point
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * return values come back on the FP stack.
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 386 ABI JNI hint format
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       ZZZZ ZZZZZZZZ AAAAAAAA AAAAAAAA
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   Z - reserved, must be 0
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *   A - size of variable argument block in 32-bit words (note - does not
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *       include JNIEnv or clazz)
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * For the 386 ABI, valid hints should always be generated.
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dvmPlatformInvokeHints( const DexProto* proto)
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const char* sig = dexProtoGetShorty(proto);
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    unsigned int jniHints, wordCount;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    char sigByte;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    wordCount = 0;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    while (true) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sigByte = *(sig++);
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sigByte == '\0')
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            break;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        wordCount++;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sigByte == 'D' || sigByte == 'J') {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            wordCount++;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (wordCount > 0xFFFF) {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /* Invalid - Dex file limitation */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        jniHints = DALVIK_JNI_NO_ARG_INFO;
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        jniHints = wordCount;
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return jniHints;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
90