Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2005, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30 #ifndef _BASICTYPES_H_
     31 #define _BASICTYPES_H_
     32 
     33 #include <config.h>
     34 #include <string.h>       // for memcpy()
     35 #ifdef HAVE_INTTYPES_H
     36 #include <inttypes.h>     // gets us PRId64, etc
     37 #endif
     38 
     39 // To use this in an autoconf setting, make sure you run the following
     40 // autoconf macros:
     41 //    AC_HEADER_STDC              /* for stdint_h and inttypes_h */
     42 //    AC_CHECK_TYPES([__int64])   /* defined in some windows platforms */
     43 
     44 #ifdef HAVE_INTTYPES_H
     45 #include <inttypes.h>           // uint16_t might be here; PRId64 too.
     46 #endif
     47 #ifdef HAVE_STDINT_H
     48 #include <stdint.h>             // to get uint16_t (ISO naming madness)
     49 #endif
     50 #include <sys/types.h>          // our last best hope for uint16_t
     51 
     52 // Standard typedefs
     53 // All Google code is compiled with -funsigned-char to make "char"
     54 // unsigned.  Google code therefore doesn't need a "uchar" type.
     55 // TODO(csilvers): how do we make sure unsigned-char works on non-gcc systems?
     56 typedef signed char         schar;
     57 typedef int8_t              int8;
     58 typedef int16_t             int16;
     59 typedef int32_t             int32;
     60 typedef int64_t             int64;
     61 
     62 // NOTE: unsigned types are DANGEROUS in loops and other arithmetical
     63 // places.  Use the signed types unless your variable represents a bit
     64 // pattern (eg a hash value) or you really need the extra bit.  Do NOT
     65 // use 'unsigned' to express "this value should always be positive";
     66 // use assertions for this.
     67 
     68 typedef uint8_t            uint8;
     69 typedef uint16_t           uint16;
     70 typedef uint32_t           uint32;
     71 typedef uint64_t           uint64;
     72 
     73 const uint16 kuint16max = (   (uint16) 0xFFFF);
     74 const uint32 kuint32max = (   (uint32) 0xFFFFFFFF);
     75 const uint64 kuint64max = ( (((uint64) kuint32max) << 32) | kuint32max );
     76 
     77 const  int8  kint8max   = (   (  int8) 0x7F);
     78 const  int16 kint16max  = (   ( int16) 0x7FFF);
     79 const  int32 kint32max  = (   ( int32) 0x7FFFFFFF);
     80 const  int64 kint64max =  ( ((( int64) kint32max) << 32) | kuint32max );
     81 
     82 const  int8  kint8min   = (   (  int8) 0x80);
     83 const  int16 kint16min  = (   ( int16) 0x8000);
     84 const  int32 kint32min  = (   ( int32) 0x80000000);
     85 const  int64 kint64min =  ( ((( int64) kint32min) << 32) | 0 );
     86 
     87 // Define the "portable" printf and scanf macros, if they're not
     88 // already there (via the inttypes.h we #included above, hopefully).
     89 // Mostly it's old systems that don't support inttypes.h, so we assume
     90 // they're 32 bit.
     91 #ifndef PRIx64
     92 #define PRIx64 "llx"
     93 #endif
     94 #ifndef SCNx64
     95 #define SCNx64 "llx"
     96 #endif
     97 #ifndef PRId64
     98 #define PRId64 "lld"
     99 #endif
    100 #ifndef SCNd64
    101 #define SCNd64 "lld"
    102 #endif
    103 #ifndef PRIu64
    104 #define PRIu64 "llu"
    105 #endif
    106 #ifndef PRIxPTR
    107 #define PRIxPTR "lx"
    108 #endif
    109 
    110 // Also allow for printing of a pthread_t.
    111 #define GPRIuPTHREAD "lu"
    112 #define GPRIxPTHREAD "lx"
    113 #if defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(__APPLE__) || defined(__FreeBSD__)
    114 #define PRINTABLE_PTHREAD(pthreadt) reinterpret_cast<uintptr_t>(pthreadt)
    115 #else
    116 #define PRINTABLE_PTHREAD(pthreadt) pthreadt
    117 #endif
    118 
    119 // A macro to disallow the evil copy constructor and operator= functions
    120 // This should be used in the private: declarations for a class
    121 #define DISALLOW_EVIL_CONSTRUCTORS(TypeName)    \
    122   TypeName(const TypeName&);                    \
    123   void operator=(const TypeName&)
    124 
    125 // An alternate name that leaves out the moral judgment... :-)
    126 #define DISALLOW_COPY_AND_ASSIGN(TypeName) DISALLOW_EVIL_CONSTRUCTORS(TypeName)
    127 
    128 // The COMPILE_ASSERT macro can be used to verify that a compile time
    129 // expression is true. For example, you could use it to verify the
    130 // size of a static array:
    131 //
    132 //   COMPILE_ASSERT(sizeof(num_content_type_names) == sizeof(int),
    133 //                  content_type_names_incorrect_size);
    134 //
    135 // or to make sure a struct is smaller than a certain size:
    136 //
    137 //   COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large);
    138 //
    139 // The second argument to the macro is the name of the variable. If
    140 // the expression is false, most compilers will issue a warning/error
    141 // containing the name of the variable.
    142 //
    143 // Implementation details of COMPILE_ASSERT:
    144 //
    145 // - COMPILE_ASSERT works by defining an array type that has -1
    146 //   elements (and thus is invalid) when the expression is false.
    147 //
    148 // - The simpler definition
    149 //
    150 //     #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1]
    151 //
    152 //   does not work, as gcc supports variable-length arrays whose sizes
    153 //   are determined at run-time (this is gcc's extension and not part
    154 //   of the C++ standard).  As a result, gcc fails to reject the
    155 //   following code with the simple definition:
    156 //
    157 //     int foo;
    158 //     COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is
    159 //                               // not a compile-time constant.
    160 //
    161 // - By using the type CompileAssert<(bool(expr))>, we ensures that
    162 //   expr is a compile-time constant.  (Template arguments must be
    163 //   determined at compile-time.)
    164 //
    165 // - The outter parentheses in CompileAssert<(bool(expr))> are necessary
    166 //   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
    167 //
    168 //     CompileAssert<bool(expr)>
    169 //
    170 //   instead, these compilers will refuse to compile
    171 //
    172 //     COMPILE_ASSERT(5 > 0, some_message);
    173 //
    174 //   (They seem to think the ">" in "5 > 0" marks the end of the
    175 //   template argument list.)
    176 //
    177 // - The array size is (bool(expr) ? 1 : -1), instead of simply
    178 //
    179 //     ((expr) ? 1 : -1).
    180 //
    181 //   This is to avoid running into a bug in MS VC 7.1, which
    182 //   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
    183 
    184 template <bool>
    185 struct CompileAssert {
    186 };
    187 
    188 #define COMPILE_ASSERT(expr, msg)                               \
    189   typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
    190 
    191 #define arraysize(a)  (sizeof(a) / sizeof(*(a)))
    192 
    193 #define OFFSETOF_MEMBER(strct, field)                                   \
    194    (reinterpret_cast<char*>(&reinterpret_cast<strct*>(16)->field) -     \
    195     reinterpret_cast<char*>(16))
    196 
    197 // bit_cast<Dest,Source> implements the equivalent of
    198 // "*reinterpret_cast<Dest*>(&source)".
    199 //
    200 // The reinterpret_cast method would produce undefined behavior
    201 // according to ISO C++ specification section 3.10 -15 -.
    202 // bit_cast<> calls memcpy() which is blessed by the standard,
    203 // especially by the example in section 3.9.
    204 //
    205 // Fortunately memcpy() is very fast.  In optimized mode, with a
    206 // constant size, gcc 2.95.3, gcc 4.0.1, and msvc 7.1 produce inline
    207 // code with the minimal amount of data movement.  On a 32-bit system,
    208 // memcpy(d,s,4) compiles to one load and one store, and memcpy(d,s,8)
    209 // compiles to two loads and two stores.
    210 
    211 template <class Dest, class Source>
    212 inline Dest bit_cast(const Source& source) {
    213   COMPILE_ASSERT(sizeof(Dest) == sizeof(Source), bitcasting_unequal_sizes);
    214   Dest dest;
    215   memcpy(&dest, &source, sizeof(dest));
    216   return dest;
    217 }
    218 
    219 #ifdef HAVE___ATTRIBUTE__
    220 # define ATTRIBUTE_WEAK      __attribute__((weak))
    221 # define ATTRIBUTE_NOINLINE  __attribute__((noinline))
    222 #else
    223 # define ATTRIBUTE_WEAK
    224 # define ATTRIBUTE_NOINLINE
    225 #endif
    226 
    227 // Section attributes are supported for both ELF and Mach-O, but in
    228 // very different ways.  Here's the API we provide:
    229 // 1) ATTRIBUTE_SECTION: put this with the declaration of all functions
    230 //    you want to be in the same linker section
    231 // 2) DEFINE_ATTRIBUTE_SECTION_VARS: must be called once per unique
    232 //    name.  You want to make sure this is executed before any
    233 //    DECLARE_ATTRIBUTE_SECTION_VARS; the easiest way is to put them
    234 //    in the same .cc file.  Put this call at the global level.
    235 // 3) INIT_ATTRIBUTE_SECTION_VARS: you can scatter calls to this in
    236 //    multiple places to help ensure execution before any
    237 //    DECLARE_ATTRIBUTE_SECTION_VARS.  You must have at least one
    238 //    DEFINE, but you can have many INITs.  Put each in its own scope.
    239 // 4) DECLARE_ATTRIBUTE_SECTION_VARS: must be called before using
    240 //    ATTRIBUTE_SECTION_START or ATTRIBUTE_SECTION_STOP on a name.
    241 //    Put this call at the global level.
    242 // 5) ATTRIBUTE_SECTION_START/ATTRIBUTE_SECTION_STOP: call this to say
    243 //    where in memory a given section is.  All functions declared with
    244 //    ATTRIBUTE_SECTION are guaranteed to be between START and STOP.
    245 
    246 #if defined(HAVE___ATTRIBUTE__) && defined(__ELF__)
    247 # define ATTRIBUTE_SECTION(name) __attribute__ ((section (#name)))
    248 
    249   // Weak section declaration to be used as a global declaration
    250   // for ATTRIBUTE_SECTION_START|STOP(name) to compile and link
    251   // even without functions with ATTRIBUTE_SECTION(name).
    252 # define DECLARE_ATTRIBUTE_SECTION_VARS(name) \
    253     extern char __start_##name[] ATTRIBUTE_WEAK; \
    254     extern char __stop_##name[] ATTRIBUTE_WEAK
    255 # define INIT_ATTRIBUTE_SECTION_VARS(name)     // no-op for ELF
    256 # define DEFINE_ATTRIBUTE_SECTION_VARS(name)   // no-op for ELF
    257 
    258   // Return void* pointers to start/end of a section of code with functions
    259   // having ATTRIBUTE_SECTION(name), or 0 if no such function exists.
    260   // One must DECLARE_ATTRIBUTE_SECTION(name) for this to compile and link.
    261 # define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(__start_##name))
    262 # define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(__stop_##name))
    263 # define HAVE_ATTRIBUTE_SECTION_START 1
    264 
    265 #elif defined(HAVE___ATTRIBUTE__) && defined(__MACH__)
    266 # define ATTRIBUTE_SECTION(name) __attribute__ ((section ("__TEXT, " #name)))
    267 
    268 #include <mach-o/getsect.h>
    269 #include <mach-o/dyld.h>
    270 class AssignAttributeStartEnd {
    271  public:
    272   AssignAttributeStartEnd(const char* name, char** pstart, char** pend) {
    273     // Find out what dynamic library name is defined in
    274     if (_dyld_present()) {
    275       for (int i = _dyld_image_count() - 1; i >= 0; --i) {
    276         const mach_header* hdr = _dyld_get_image_header(i);
    277 #ifdef MH_MAGIC_64
    278         if (hdr->magic == MH_MAGIC_64) {
    279           uint64_t len;
    280           *pstart = getsectdatafromheader_64((mach_header_64*)hdr,
    281                                              "__TEXT", name, &len);
    282           if (*pstart) {   // NULL if not defined in this dynamic library
    283             *pstart += _dyld_get_image_vmaddr_slide(i);   // correct for reloc
    284             *pend = *pstart + len;
    285             return;
    286           }
    287         }
    288 #endif
    289         if (hdr->magic == MH_MAGIC) {
    290           uint32_t len;
    291           *pstart = getsectdatafromheader(hdr, "__TEXT", name, &len);
    292           if (*pstart) {   // NULL if not defined in this dynamic library
    293             *pstart += _dyld_get_image_vmaddr_slide(i);   // correct for reloc
    294             *pend = *pstart + len;
    295             return;
    296           }
    297         }
    298       }
    299     }
    300     // If we get here, not defined in a dll at all.  See if defined statically.
    301     unsigned long len;    // don't ask me why this type isn't uint32_t too...
    302     *pstart = getsectdata("__TEXT", name, &len);
    303     *pend = *pstart + len;
    304   }
    305 };
    306 
    307 #define DECLARE_ATTRIBUTE_SECTION_VARS(name)    \
    308   extern char* __start_##name;                  \
    309   extern char* __stop_##name
    310 
    311 #define INIT_ATTRIBUTE_SECTION_VARS(name)               \
    312   DECLARE_ATTRIBUTE_SECTION_VARS(name);                 \
    313   static const AssignAttributeStartEnd __assign_##name( \
    314     #name, &__start_##name, &__stop_##name)
    315 
    316 #define DEFINE_ATTRIBUTE_SECTION_VARS(name)     \
    317   char* __start_##name, *__stop_##name;         \
    318   INIT_ATTRIBUTE_SECTION_VARS(name)
    319 
    320 # define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(__start_##name))
    321 # define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(__stop_##name))
    322 # define HAVE_ATTRIBUTE_SECTION_START 1
    323 
    324 #else  // not HAVE___ATTRIBUTE__ && __ELF__, nor HAVE___ATTRIBUTE__ && __MACH__
    325 # define ATTRIBUTE_SECTION(name)
    326 # define DECLARE_ATTRIBUTE_SECTION_VARS(name)
    327 # define INIT_ATTRIBUTE_SECTION_VARS(name)
    328 # define DEFINE_ATTRIBUTE_SECTION_VARS(name)
    329 # define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void*>(0))
    330 # define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void*>(0))
    331 
    332 #endif  // HAVE___ATTRIBUTE__ and __ELF__ or __MACH__
    333 
    334 #if defined(HAVE___ATTRIBUTE__) && (defined(__i386__) || defined(__x86_64__))
    335 # define CACHELINE_ALIGNED __attribute__((aligned(64)))
    336 #else
    337 # define CACHELINE_ALIGNED
    338 #endif  // defined(HAVE___ATTRIBUTE__) && (__i386__ || __x86_64__)
    339 
    340 
    341 // The following enum should be used only as a constructor argument to indicate
    342 // that the variable has static storage class, and that the constructor should
    343 // do nothing to its state.  It indicates to the reader that it is legal to
    344 // declare a static nistance of the class, provided the constructor is given
    345 // the base::LINKER_INITIALIZED argument.  Normally, it is unsafe to declare a
    346 // static variable that has a constructor or a destructor because invocation
    347 // order is undefined.  However, IF the type can be initialized by filling with
    348 // zeroes (which the loader does for static variables), AND the destructor also
    349 // does nothing to the storage, then a constructor declared as
    350 //       explicit MyClass(base::LinkerInitialized x) {}
    351 // and invoked as
    352 //       static MyClass my_variable_name(base::LINKER_INITIALIZED);
    353 namespace base {
    354 enum LinkerInitialized { LINKER_INITIALIZED };
    355 }
    356 
    357 #endif  // _BASICTYPES_H_
    358