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 */
16734155efc18543eab20b763f9a315ab1a44240acAndy McFadden
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Common defines for all Dalvik code.
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
20375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef DALVIK_COMMON_H_
21375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define DALVIK_COMMON_H_
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef LOG_TAG
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define LOG_TAG "dalvikvm"
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro#include <stdbool.h>
28ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro#include <stdint.h>
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <stdio.h>
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include <assert.h>
31ac518bce0e538749b12c09d4400cb0d30c350391Elliott Hughes#include "cutils/log.h"
32ae188c676c681e47a93ade7fdf0144099b470e03Carl Shapiro
3338e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom#if defined(HAVE_ENDIAN_H)
3438e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom# include <endian.h>
3538e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom#else /*not HAVE_ENDIAN_H*/
3638e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom# define __BIG_ENDIAN 4321
3738e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom# define __LITTLE_ENDIAN 1234
3838e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom# if defined(HAVE_LITTLE_ENDIAN)
3938e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom#  define __BYTE_ORDER __LITTLE_ENDIAN
4038e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom# else
4138e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom#  define __BYTE_ORDER __BIG_ENDIAN
4238e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom# endif
4338e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom#endif /*not HAVE_ENDIAN_H*/
4438e191b85851e8ff3126ce680c615a189558e5ffBrian Carlstrom
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if !defined(NDEBUG) && defined(WITH_DALVIK_ASSERT)
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# undef assert
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define assert(x) \
48c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block    ((x) ? ((void)0) : (ALOGE("ASSERT FAILED (%s:%d): %s", \
494a1ef7d56111423fc78bb5e55b710fd9ca0e02ecCarl Shapiro        __FILE__, __LINE__, #x), *(int*)39=39, (void)0) )
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5299fc4560d75078b92daea33795489ac477e26cdaCarl Shapiro#define MIN(x,y) (((x) < (y)) ? (x) : (y))
5399fc4560d75078b92daea33795489ac477e26cdaCarl Shapiro#define MAX(x,y) (((x) > (y)) ? (x) : (y))
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55a20a99298b45b4b6c7c9c528066a3e055e601535Carl Shapiro#define LIKELY(exp) (__builtin_expect((exp) != 0, true))
56a20a99298b45b4b6c7c9c528066a3e055e601535Carl Shapiro#define UNLIKELY(exp) (__builtin_expect((exp) != 0, false))
57a20a99298b45b4b6c7c9c528066a3e055e601535Carl Shapiro
58cc3f8b43f6703a43bb3f48794c622b55f40402adCarl Shapiro#define ALIGN_UP(x, n) (((size_t)(x) + (n) - 1) & ~((n) - 1))
59cc3f8b43f6703a43bb3f48794c622b55f40402adCarl Shapiro#define ALIGN_DOWN(x, n) ((size_t)(x) & -(n))
60cc3f8b43f6703a43bb3f48794c622b55f40402adCarl Shapiro#define ALIGN_UP_TO_PAGE_SIZE(p) ALIGN_UP(p, SYSTEM_PAGE_SIZE)
61cc3f8b43f6703a43bb3f48794c622b55f40402adCarl Shapiro#define ALIGN_DOWN_TO_PAGE_SIZE(p) ALIGN_DOWN(p, SYSTEM_PAGE_SIZE)
62cc3f8b43f6703a43bb3f48794c622b55f40402adCarl Shapiro
6367f9be7f5d77cc0ab2237ce4281eede9e496bb89Carl Shapiro#define CLZ(x) __builtin_clz(x)
6467f9be7f5d77cc0ab2237ce4281eede9e496bb89Carl Shapiro
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
6692c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block * If "very verbose" logging is enabled, make it equivalent to ALOGV.
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Otherwise, make it disappear.
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Define this above the #include "Dalvik.h" to enable for only a
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * single file.
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* #define VERY_VERBOSE_LOG */
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#if defined(VERY_VERBOSE_LOG)
7492c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block# define LOGVV      ALOGV
7592c1f6f1b4249e4e379452ee7b49f027052bf4ceSteve Block# define IF_LOGVV() IF_ALOGV()
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define LOGVV(...) ((void)0)
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define IF_LOGVV() if (false)
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * These match the definitions in the VM specification.
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint8_t             u1;
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint16_t            u2;
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint32_t            u4;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef uint64_t            u8;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int8_t              s1;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int16_t             s2;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int32_t             s4;
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projecttypedef int64_t             s8;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Storage for primitive types and object references.
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Some parts of the code (notably object field access) assume that values
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are "left aligned", i.e. given "JValue jv", "jv.i" and "*((s4*)&jv)"
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * yield the same result.  This seems to be guaranteed by gcc on big- and
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * little-endian systems.
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
10292a3b69286a757afff76402d8a0d5ec04d7f177cCarl Shapirostruct Object;
10392a3b69286a757afff76402d8a0d5ec04d7f177cCarl Shapiro
10492a3b69286a757afff76402d8a0d5ec04d7f177cCarl Shapirounion JValue {
10564793fc548200f9b6da0782e7b276743a529c807Chris Dearman#if defined(HAVE_LITTLE_ENDIAN)
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1      z;
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    s1      b;
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2      c;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    s2      s;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    s4      i;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    s8      j;
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    float   f;
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    double  d;
11492a3b69286a757afff76402d8a0d5ec04d7f177cCarl Shapiro    Object* l;
11564793fc548200f9b6da0782e7b276743a529c807Chris Dearman#endif
11664793fc548200f9b6da0782e7b276743a529c807Chris Dearman#if defined(HAVE_BIG_ENDIAN)
11764793fc548200f9b6da0782e7b276743a529c807Chris Dearman    struct {
11864793fc548200f9b6da0782e7b276743a529c807Chris Dearman        u1    _z[3];
11964793fc548200f9b6da0782e7b276743a529c807Chris Dearman        u1    z;
12064793fc548200f9b6da0782e7b276743a529c807Chris Dearman    };
12164793fc548200f9b6da0782e7b276743a529c807Chris Dearman    struct {
12264793fc548200f9b6da0782e7b276743a529c807Chris Dearman        s1    _b[3];
12364793fc548200f9b6da0782e7b276743a529c807Chris Dearman        s1    b;
12464793fc548200f9b6da0782e7b276743a529c807Chris Dearman    };
12564793fc548200f9b6da0782e7b276743a529c807Chris Dearman    struct {
12664793fc548200f9b6da0782e7b276743a529c807Chris Dearman        u2    _c;
12764793fc548200f9b6da0782e7b276743a529c807Chris Dearman        u2    c;
12864793fc548200f9b6da0782e7b276743a529c807Chris Dearman    };
12964793fc548200f9b6da0782e7b276743a529c807Chris Dearman    struct {
13064793fc548200f9b6da0782e7b276743a529c807Chris Dearman        s2    _s;
13164793fc548200f9b6da0782e7b276743a529c807Chris Dearman        s2    s;
13264793fc548200f9b6da0782e7b276743a529c807Chris Dearman    };
13364793fc548200f9b6da0782e7b276743a529c807Chris Dearman    s4      i;
13464793fc548200f9b6da0782e7b276743a529c807Chris Dearman    s8      j;
13564793fc548200f9b6da0782e7b276743a529c807Chris Dearman    float   f;
13664793fc548200f9b6da0782e7b276743a529c807Chris Dearman    double  d;
13764793fc548200f9b6da0782e7b276743a529c807Chris Dearman    void*   l;
13864793fc548200f9b6da0782e7b276743a529c807Chris Dearman#endif
13992a3b69286a757afff76402d8a0d5ec04d7f177cCarl Shapiro};
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1417cc095f8e3ec52ba94d91e1d327354f61236496aCarl Shapiro#define OFFSETOF_MEMBER(t, f)         \
1427cc095f8e3ec52ba94d91e1d327354f61236496aCarl Shapiro  (reinterpret_cast<char*>(           \
1437cc095f8e3ec52ba94d91e1d327354f61236496aCarl Shapiro     &reinterpret_cast<t*>(16)->f) -  \
1447cc095f8e3ec52ba94d91e1d327354f61236496aCarl Shapiro   reinterpret_cast<char*>(16))
1457cc095f8e3ec52ba94d91e1d327354f61236496aCarl Shapiro
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // DALVIK_COMMON_H_
149