qemu/disas/libvixl/vixl/globals.h
<<
>>
Prefs
   1// Copyright 2015, ARM Limited
   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 met:
   6//
   7//   * Redistributions of source code must retain the above copyright notice,
   8//     this list of conditions and the following disclaimer.
   9//   * Redistributions in binary form must reproduce the above copyright notice,
  10//     this list of conditions and the following disclaimer in the documentation
  11//     and/or other materials provided with the distribution.
  12//   * Neither the name of ARM Limited nor the names of its contributors may be
  13//     used to endorse or promote products derived from this software without
  14//     specific prior written permission.
  15//
  16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND
  17// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
  20// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26
  27#ifndef VIXL_GLOBALS_H
  28#define VIXL_GLOBALS_H
  29
  30// Get standard C99 macros for integer types.
  31#ifndef __STDC_CONSTANT_MACROS
  32#define __STDC_CONSTANT_MACROS
  33#endif
  34
  35#ifndef __STDC_LIMIT_MACROS
  36#define __STDC_LIMIT_MACROS
  37#endif
  38
  39#ifndef __STDC_FORMAT_MACROS
  40#define __STDC_FORMAT_MACROS
  41#endif
  42
  43#include <stdint.h>
  44#include <inttypes.h>
  45
  46#include <assert.h>
  47#include <stdarg.h>
  48#include <stdio.h>
  49#include <stdint.h>
  50#include <stdlib.h>
  51#include <stddef.h>
  52#include "vixl/platform.h"
  53
  54
  55typedef uint8_t byte;
  56
  57// Type for half-precision (16 bit) floating point numbers.
  58typedef uint16_t float16;
  59
  60const int KBytes = 1024;
  61const int MBytes = 1024 * KBytes;
  62
  63#define VIXL_ABORT() \
  64    do { printf("in %s, line %i", __FILE__, __LINE__); abort(); } while (false)
  65#ifdef VIXL_DEBUG
  66  #define VIXL_ASSERT(condition) assert(condition)
  67  #define VIXL_CHECK(condition) VIXL_ASSERT(condition)
  68  #define VIXL_UNIMPLEMENTED() \
  69    do { fprintf(stderr, "UNIMPLEMENTED\t"); VIXL_ABORT(); } while (false)
  70  #define VIXL_UNREACHABLE() \
  71    do { fprintf(stderr, "UNREACHABLE\t"); VIXL_ABORT(); } while (false)
  72#else
  73  #define VIXL_ASSERT(condition) ((void) 0)
  74  #define VIXL_CHECK(condition) assert(condition)
  75  #define VIXL_UNIMPLEMENTED() ((void) 0)
  76  #define VIXL_UNREACHABLE() ((void) 0)
  77#endif
  78// This is not as powerful as template based assertions, but it is simple.
  79// It assumes that the descriptions are unique. If this starts being a problem,
  80// we can switch to a different implemention.
  81#define VIXL_CONCAT(a, b) a##b
  82#define VIXL_STATIC_ASSERT_LINE(line, condition) \
  83  typedef char VIXL_CONCAT(STATIC_ASSERT_LINE_, line)[(condition) ? 1 : -1] \
  84  __attribute__((unused))
  85#define VIXL_STATIC_ASSERT(condition) \
  86    VIXL_STATIC_ASSERT_LINE(__LINE__, condition)
  87
  88template <typename T1>
  89inline void USE(T1) {}
  90
  91template <typename T1, typename T2>
  92inline void USE(T1, T2) {}
  93
  94template <typename T1, typename T2, typename T3>
  95inline void USE(T1, T2, T3) {}
  96
  97template <typename T1, typename T2, typename T3, typename T4>
  98inline void USE(T1, T2, T3, T4) {}
  99
 100#define VIXL_ALIGNMENT_EXCEPTION() \
 101    do { fprintf(stderr, "ALIGNMENT EXCEPTION\t"); VIXL_ABORT(); } while (0)
 102
 103// The clang::fallthrough attribute is used along with the Wimplicit-fallthrough
 104// argument to annotate intentional fall-through between switch labels.
 105// For more information please refer to:
 106// http://clang.llvm.org/docs/AttributeReference.html#fallthrough-clang-fallthrough
 107#ifndef __has_warning
 108  #define __has_warning(x)  0
 109#endif
 110
 111// Note: This option is only available for Clang. And will only be enabled for
 112// C++11(201103L).
 113#if __has_warning("-Wimplicit-fallthrough") && __cplusplus >= 201103L
 114  #define VIXL_FALLTHROUGH() [[clang::fallthrough]] //NOLINT
 115#else
 116  #define VIXL_FALLTHROUGH() do {} while (0)
 117#endif
 118
 119#if __cplusplus >= 201103L
 120  #define VIXL_NO_RETURN  [[noreturn]] //NOLINT
 121#else
 122  #define VIXL_NO_RETURN  __attribute__((noreturn))
 123#endif
 124
 125// Some functions might only be marked as "noreturn" for the DEBUG build. This
 126// macro should be used for such cases (for more details see what
 127// VIXL_UNREACHABLE expands to).
 128#ifdef VIXL_DEBUG
 129  #define VIXL_DEBUG_NO_RETURN  VIXL_NO_RETURN
 130#else
 131  #define VIXL_DEBUG_NO_RETURN
 132#endif
 133
 134#ifdef VIXL_INCLUDE_SIMULATOR
 135#ifndef VIXL_GENERATE_SIMULATOR_INSTRUCTIONS_VALUE
 136  #define VIXL_GENERATE_SIMULATOR_INSTRUCTIONS_VALUE  1
 137#endif
 138#else
 139#ifndef VIXL_GENERATE_SIMULATOR_INSTRUCTIONS_VALUE
 140  #define VIXL_GENERATE_SIMULATOR_INSTRUCTIONS_VALUE  0
 141#endif
 142#if VIXL_GENERATE_SIMULATOR_INSTRUCTIONS_VALUE
 143  #warning "Generating Simulator instructions without Simulator support."
 144#endif
 145#endif
 146
 147#ifdef USE_SIMULATOR
 148  #error "Please see the release notes for USE_SIMULATOR."
 149#endif
 150
 151#endif  // VIXL_GLOBALS_H
 152