15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2005, Google Inc. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef _BASICTYPES_H_ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _BASICTYPES_H_ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <config.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> // for memcpy() 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_INTTYPES_H 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <inttypes.h> // gets us PRId64, etc 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To use this in an autoconf setting, make sure you run the following 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// autoconf macros: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AC_HEADER_STDC /* for stdint_h and inttypes_h */ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AC_CHECK_TYPES([__int64]) /* defined in some windows platforms */ 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_INTTYPES_H 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <inttypes.h> // uint16_t might be here; PRId64 too. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_STDINT_H 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdint.h> // to get uint16_t (ISO naming madness) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> // our last best hope for uint16_t 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Standard typedefs 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All Google code is compiled with -funsigned-char to make "char" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unsigned. Google code therefore doesn't need a "uchar" type. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(csilvers): how do we make sure unsigned-char works on non-gcc systems? 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef signed char schar; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int8_t int8; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int16_t int16; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int32_t int32; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64_t int64; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: unsigned types are DANGEROUS in loops and other arithmetical 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// places. Use the signed types unless your variable represents a bit 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// pattern (eg a hash value) or you really need the extra bit. Do NOT 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use 'unsigned' to express "this value should always be positive"; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// use assertions for this. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8_t uint8; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint16_t uint16; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32_t uint32; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64_t uint64; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint16 kuint16max = ( (uint16) 0xFFFF); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32 kuint32max = ( (uint32) 0xFFFFFFFF); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint64 kuint64max = ( (((uint64) kuint32max) << 32) | kuint32max ); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int8 kint8max = ( ( int8) 0x7F); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int16 kint16max = ( ( int16) 0x7FFF); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kint32max = ( ( int32) 0x7FFFFFFF); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kint64max = ( ((( int64) kint32max) << 32) | kuint32max ); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int8 kint8min = ( ( int8) 0x80); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int16 kint16min = ( ( int16) 0x8000); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int32 kint32min = ( ( int32) 0x80000000); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kint64min = ( ((( int64) kint32min) << 32) | 0 ); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Define the "portable" printf and scanf macros, if they're not 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already there (via the inttypes.h we #included above, hopefully). 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mostly it's old systems that don't support inttypes.h, so we assume 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// they're 32 bit. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRIx64 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIx64 "llx" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SCNx64 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SCNx64 "llx" 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRId64 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRId64 "lld" 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SCNd64 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SCNd64 "lld" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRIu64 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIu64 "llu" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PRIxPTR 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRIxPTR "lx" 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also allow for printing of a pthread_t. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPRIuPTHREAD "lu" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define GPRIxPTHREAD "lx" 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__APPLE__) || defined(__FreeBSD__) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRINTABLE_PTHREAD(pthreadt) reinterpret_cast<uintptr_t>(pthreadt) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PRINTABLE_PTHREAD(pthreadt) pthreadt 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A macro to disallow the evil copy constructor and operator= functions 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This should be used in the private: declarations for a class 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DISALLOW_EVIL_CONSTRUCTORS(TypeName) \ 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TypeName(const TypeName&); \ 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void operator=(const TypeName&) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An alternate name that leaves out the moral judgment... :-) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DISALLOW_COPY_AND_ASSIGN(TypeName) DISALLOW_EVIL_CONSTRUCTORS(TypeName) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The COMPILE_ASSERT macro can be used to verify that a compile time 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expression is true. For example, you could use it to verify the 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// size of a static array: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMPILE_ASSERT(sizeof(num_content_type_names) == sizeof(int), 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content_type_names_incorrect_size); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or to make sure a struct is smaller than a certain size: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The second argument to the macro is the name of the variable. If 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the expression is false, most compilers will issue a warning/error 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// containing the name of the variable. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementation details of COMPILE_ASSERT: 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - COMPILE_ASSERT works by defining an array type that has -1 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// elements (and thus is invalid) when the expression is false. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The simpler definition 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does not work, as gcc supports variable-length arrays whose sizes 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are determined at run-time (this is gcc's extension and not part 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the C++ standard). As a result, gcc fails to reject the 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// following code with the simple definition: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// int foo; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// // not a compile-time constant. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - By using the type CompileAssert<(bool(expr))>, we ensures that 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expr is a compile-time constant. (Template arguments must be 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determined at compile-time.) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The outter parentheses in CompileAssert<(bool(expr))> are necessary 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CompileAssert<bool(expr)> 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// instead, these compilers will refuse to compile 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// COMPILE_ASSERT(5 > 0, some_message); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (They seem to think the ">" in "5 > 0" marks the end of the 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// template argument list.) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - The array size is (bool(expr) ? 1 : -1), instead of simply 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ((expr) ? 1 : -1). 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is to avoid running into a bug in MS VC 7.1, which 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <bool> 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CompileAssert { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPILE_ASSERT(expr, msg) \ 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define arraysize(a) (sizeof(a) / sizeof(*(a))) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define OFFSETOF_MEMBER(strct, field) \ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reinterpret_cast<char*>(&reinterpret_cast<strct*>(16)->field) - \ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<char*>(16)) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bit_cast<Dest,Source> implements the equivalent of 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "*reinterpret_cast<Dest*>(&source)". 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The reinterpret_cast method would produce undefined behavior 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// according to ISO C++ specification section 3.10 -15 -. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bit_cast<> calls memcpy() which is blessed by the standard, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// especially by the example in section 3.9. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fortunately memcpy() is very fast. In optimized mode, with a 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constant size, gcc 2.95.3, gcc 4.0.1, and msvc 7.1 produce inline 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// code with the minimal amount of data movement. On a 32-bit system, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memcpy(d,s,4) compiles to one load and one store, and memcpy(d,s,8) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compiles to two loads and two stores. 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class Dest, class Source> 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline Dest bit_cast(const Source& source) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(sizeof(Dest) == sizeof(Source), bitcasting_unequal_sizes); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Dest dest; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(&dest, &source, sizeof(dest)); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return dest; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE___ATTRIBUTE__ 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_WEAK __attribute__((weak)) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_NOINLINE __attribute__((noinline)) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_WEAK 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_NOINLINE 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Section attributes are supported for both ELF and Mach-O, but in 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// very different ways. Here's the API we provide: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) ATTRIBUTE_SECTION: put this with the declaration of all functions 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// you want to be in the same linker section 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) DEFINE_ATTRIBUTE_SECTION_VARS: must be called once per unique 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// name. You want to make sure this is executed before any 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DECLARE_ATTRIBUTE_SECTION_VARS; the easiest way is to put them 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the same .cc file. Put this call at the global level. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) INIT_ATTRIBUTE_SECTION_VARS: you can scatter calls to this in 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// multiple places to help ensure execution before any 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DECLARE_ATTRIBUTE_SECTION_VARS. You must have at least one 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DEFINE, but you can have many INITs. Put each in its own scope. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 4) DECLARE_ATTRIBUTE_SECTION_VARS: must be called before using 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ATTRIBUTE_SECTION_START or ATTRIBUTE_SECTION_STOP on a name. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Put this call at the global level. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 5) ATTRIBUTE_SECTION_START/ATTRIBUTE_SECTION_STOP: call this to say 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// where in memory a given section is. All functions declared with 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ATTRIBUTE_SECTION are guaranteed to be between START and STOP. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE___ATTRIBUTE__) && defined(__ELF__) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION(name) __attribute__ ((section (#name))) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak section declaration to be used as a global declaration 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for ATTRIBUTE_SECTION_START|STOP(name) to compile and link 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even without functions with ATTRIBUTE_SECTION(name). 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DECLARE_ATTRIBUTE_SECTION_VARS(name) \ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern char __start_##name[] ATTRIBUTE_WEAK; \ 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern char __stop_##name[] ATTRIBUTE_WEAK 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define INIT_ATTRIBUTE_SECTION_VARS(name) // no-op for ELF 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DEFINE_ATTRIBUTE_SECTION_VARS(name) // no-op for ELF 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return void* pointers to start/end of a section of code with functions 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // having ATTRIBUTE_SECTION(name), or 0 if no such function exists. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One must DECLARE_ATTRIBUTE_SECTION(name) for this to compile and link. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(__start_##name)) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(__stop_##name)) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_ATTRIBUTE_SECTION_START 1 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(HAVE___ATTRIBUTE__) && defined(__MACH__) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION(name) __attribute__ ((section ("__TEXT, " #name))) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mach-o/getsect.h> 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <mach-o/dyld.h> 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AssignAttributeStartEnd { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AssignAttributeStartEnd(const char* name, char** pstart, char** pend) { 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find out what dynamic library name is defined in 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (_dyld_present()) { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = _dyld_image_count() - 1; i >= 0; --i) { 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const mach_header* hdr = _dyld_get_image_header(i); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef MH_MAGIC_64 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hdr->magic == MH_MAGIC_64) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint64_t len; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pstart = getsectdatafromheader_64((mach_header_64*)hdr, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "__TEXT", name, &len); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*pstart) { // NULL if not defined in this dynamic library 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pstart += _dyld_get_image_vmaddr_slide(i); // correct for reloc 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pend = *pstart + len; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hdr->magic == MH_MAGIC) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t len; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pstart = getsectdatafromheader(hdr, "__TEXT", name, &len); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*pstart) { // NULL if not defined in this dynamic library 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pstart += _dyld_get_image_vmaddr_slide(i); // correct for reloc 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pend = *pstart + len; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we get here, not defined in a dll at all. See if defined statically. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long len; // don't ask me why this type isn't uint32_t too... 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pstart = getsectdata("__TEXT", name, &len); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *pend = *pstart + len; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DECLARE_ATTRIBUTE_SECTION_VARS(name) \ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern char* __start_##name; \ 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extern char* __stop_##name 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INIT_ATTRIBUTE_SECTION_VARS(name) \ 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DECLARE_ATTRIBUTE_SECTION_VARS(name); \ 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const AssignAttributeStartEnd __assign_##name( \ 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) #name, &__start_##name, &__stop_##name) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DEFINE_ATTRIBUTE_SECTION_VARS(name) \ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* __start_##name, *__stop_##name; \ 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INIT_ATTRIBUTE_SECTION_VARS(name) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(__start_##name)) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(__stop_##name)) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define HAVE_ATTRIBUTE_SECTION_START 1 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else // not HAVE___ATTRIBUTE__ && __ELF__, nor HAVE___ATTRIBUTE__ && __MACH__ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION(name) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DECLARE_ATTRIBUTE_SECTION_VARS(name) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define INIT_ATTRIBUTE_SECTION_VARS(name) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define DEFINE_ATTRIBUTE_SECTION_VARS(name) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(0)) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(0)) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // HAVE___ATTRIBUTE__ and __ELF__ or __MACH__ 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE___ATTRIBUTE__) && (defined(__i386__) || defined(__x86_64__)) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define CACHELINE_ALIGNED __attribute__((aligned(64))) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# define CACHELINE_ALIGNED 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(HAVE___ATTRIBUTE__) && (__i386__ || __x86_64__) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The following enum should be used only as a constructor argument to indicate 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that the variable has static storage class, and that the constructor should 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// do nothing to its state. It indicates to the reader that it is legal to 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// declare a static nistance of the class, provided the constructor is given 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the base::LINKER_INITIALIZED argument. Normally, it is unsafe to declare a 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static variable that has a constructor or a destructor because invocation 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// order is undefined. However, IF the type can be initialized by filling with 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// zeroes (which the loader does for static variables), AND the destructor also 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does nothing to the storage, then a constructor declared as 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// explicit MyClass(base::LinkerInitialized x) {} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and invoked as 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static MyClass my_variable_name(base::LINKER_INITIALIZED); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum LinkerInitialized { LINKER_INITIALIZED }; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // _BASICTYPES_H_ 358