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