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