1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// This file contains platform-specific typedefs and defines. 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Much of it is derived from Chromium's build/build_config.h. 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_TYPEDEFS_H_ 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_TYPEDEFS_H_ 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Processor architecture detection. For more info on what's defined, see: 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// http://msdn.microsoft.com/en-us/library/b0084kay.aspx 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// http://www.agner.org/optimize/calling_conventions.pdf 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// or with gcc, run: "echo | gcc -E -dM -" 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if defined(_M_X64) || defined(__x86_64__) 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_X86_FAMILY 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_X86_64 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_64_BITS 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_LITTLE_ENDIAN 267830689de5893b02152ab479693c5ce5b1de338fandrew@webrtc.org#elif defined(__aarch64__) 27d30a9ea4a7195203ae4b9b5dbf13063510a71b50andrew@webrtc.org#define WEBRTC_ARCH_64_BITS 28d30a9ea4a7195203ae4b9b5dbf13063510a71b50andrew@webrtc.org#define WEBRTC_ARCH_LITTLE_ENDIAN 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(_M_IX86) || defined(__i386__) 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_X86_FAMILY 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_X86 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_32_BITS 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_LITTLE_ENDIAN 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(__ARMEL__) 35d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org// TODO(ajm): We'd prefer to control platform defines here, but this is 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// currently provided by the Android makefiles. Commented to avoid duplicate 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// definition warnings. 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//#define WEBRTC_ARCH_ARM 39d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org// TODO(ajm): Chromium uses the following two defines. Should we switch? 40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//#define WEBRTC_ARCH_ARM_FAMILY 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org//#define WEBRTC_ARCH_ARMEL 42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_32_BITS 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_LITTLE_ENDIAN 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif defined(__MIPSEL__) 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_32_BITS 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_ARCH_LITTLE_ENDIAN 471af2c14c9e0a02f3a7e128af55247db901d479b8andresp@webrtc.org#elif defined(__pnacl__) 481af2c14c9e0a02f3a7e128af55247db901d479b8andresp@webrtc.org#define WEBRTC_ARCH_32_BITS 491af2c14c9e0a02f3a7e128af55247db901d479b8andresp@webrtc.org#define WEBRTC_ARCH_LITTLE_ENDIAN 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#error Please add support for your architecture in typedefs.h 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 54d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org#if !(defined(WEBRTC_ARCH_LITTLE_ENDIAN) ^ defined(WEBRTC_ARCH_BIG_ENDIAN)) 55d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org#error Define either WEBRTC_ARCH_LITTLE_ENDIAN or WEBRTC_ARCH_BIG_ENDIAN 56d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org#endif 57d7e904161d5c59c61cbf094b16bca6e79ada713aandrew@webrtc.org 58e9d42e68688ed5dde7a6d5241decf3d05211002aandrew@webrtc.org#if (defined(WEBRTC_ARCH_X86_FAMILY) && !defined(__SSE2__)) || \ 59e9d42e68688ed5dde7a6d5241decf3d05211002aandrew@webrtc.org (defined(WEBRTC_ARCH_ARM_V7) && !defined(WEBRTC_ARCH_ARM_NEON)) 60e9d42e68688ed5dde7a6d5241decf3d05211002aandrew@webrtc.org#define WEBRTC_CPU_DETECTION 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if !defined(_MSC_VER) 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdint.h> 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else 665350e31941086c3861f12f8a4756066ee3137c63andrew@webrtc.org// Define C99 equivalent types, since pre-2010 MSVC doesn't provide stdint.h. 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef signed char int8_t; 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef signed short int16_t; 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef signed int int32_t; 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef __int64 int64_t; 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef unsigned char uint8_t; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef unsigned short uint16_t; 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef unsigned int uint32_t; 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef unsigned __int64 uint64_t; 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 7713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// Borrowed from Chromium's base/compiler_specific.h. 7813f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// Annotate a virtual method indicating it must be overriding a virtual 7913f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// method in the parent class. 8013f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// Use like: 8113f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org// virtual void foo() OVERRIDE; 8213f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#if defined(_MSC_VER) 8313f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#define OVERRIDE override 8413f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#elif defined(__clang__) 85d7ebd68418078c255a1381d673bc99f340c174c4pbos@webrtc.org// Clang defaults to C++03 and warns about using override. Squelch that. 86d7ebd68418078c255a1381d673bc99f340c174c4pbos@webrtc.org// Intentionally no push/pop here so all users of OVERRIDE ignore the warning 87d7ebd68418078c255a1381d673bc99f340c174c4pbos@webrtc.org// too. This is like passing -Wno-c++11-extensions, except that GCC won't die 88d7ebd68418078c255a1381d673bc99f340c174c4pbos@webrtc.org// (because it won't see this pragma). 89d7ebd68418078c255a1381d673bc99f340c174c4pbos@webrtc.org#pragma clang diagnostic ignored "-Wc++11-extensions" 9013f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#define OVERRIDE override 91aa9e7685223a306a9808469ffeb20cd70bedb14candrew@webrtc.org#elif defined(__GNUC__) && __cplusplus >= 201103 && \ 92aa9e7685223a306a9808469ffeb20cd70bedb14candrew@webrtc.org (__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700 93aa9e7685223a306a9808469ffeb20cd70bedb14candrew@webrtc.org// GCC 4.7 supports explicit virtual overrides when C++11 support is enabled. 94aa9e7685223a306a9808469ffeb20cd70bedb14candrew@webrtc.org#define OVERRIDE override 9513f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#else 9613f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#define OVERRIDE 9713f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org#endif 9813f66d1472df67158e2c9d2fe1d6d6dacc69e936andrew@webrtc.org 99221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org// Annotate a function indicating the caller must examine the return value. 100221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org// Use like: 101221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org// int foo() WARN_UNUSED_RESULT; 10244a8ce5795d47bdea2f7f09d424fc48d73e760b0andrew@webrtc.org// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and 10344a8ce5795d47bdea2f7f09d424fc48d73e760b0andrew@webrtc.org// libjingle are merged. 10444a8ce5795d47bdea2f7f09d424fc48d73e760b0andrew@webrtc.org#if !defined(WARN_UNUSED_RESULT) 105221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org#if defined(__GNUC__) 106221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org#define WARN_UNUSED_RESULT __attribute__((warn_unused_result)) 107221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org#else 108221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org#define WARN_UNUSED_RESULT 109221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org#endif 11044a8ce5795d47bdea2f7f09d424fc48d73e760b0andrew@webrtc.org#endif // WARN_UNUSED_RESULT 111221798a7c4ad83ba7fb8b3ae39b99d44278bbe5aandrew@webrtc.org 112999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org// Put after a variable that might not be used, to prevent compiler warnings: 113999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org// int result UNUSED = DoSomething(); 114999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org// assert(result == 17); 115999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#ifndef UNUSED 116999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#ifdef __GNUC__ 117999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#define UNUSED __attribute__((unused)) 118999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#else 119999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#define UNUSED 120999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#endif 121999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org#endif 122999bcbc7588ed449b0ee6db29aeb79f72007488bkwiberg@webrtc.org 12354ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org// Annotate a function that will not return control flow to the caller. 12454ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#if defined(_MSC_VER) 12554ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#define NO_RETURN __declspec(noreturn) 12654ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#elif defined(__GNUC__) 12754ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#define NO_RETURN __attribute__((noreturn)) 12854ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#else 12954ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#define NO_RETURN 13054ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org#endif 13154ade8bbee7cea004418c02de3658ffc870fc968andrew@webrtc.org 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_TYPEDEFS_H_ 133