DebugServer2
Loading...
Searching...
No Matches
Headers
DebugServer2
Base.h
1
//
2
// Copyright (c) 2014-present, Facebook, Inc.
3
// All rights reserved.
4
//
5
// This source code is licensed under the University of Illinois/NCSA Open
6
// Source License found in the LICENSE file in the root directory of this
7
// source tree. An additional grant of patent rights can be found in the
8
// PATENTS file in the same directory.
9
//
10
11
#pragma once
12
13
#if defined(_WIN32)
14
// clang-format off
15
#include <winsock2.h>
16
#include <windef.h>
17
// clang-format on
18
#if !defined(__MINGW32__)
19
typedef
SSIZE_T ssize_t;
20
#endif
21
#else
22
#include <cstdlib>
23
#endif
24
#include <iostream>
25
#include <type_traits>
26
#include <memory>
27
#include <utility>
28
29
#if defined(__clang__)
30
#define COMPILER_CLANG
31
#elif defined(__GNUC__)
32
#define COMPILER_GCC
33
#elif defined(_MSC_VER)
34
#define COMPILER_MSVC
35
#else
36
#error "Compiler not supported."
37
#endif
38
39
#if defined(__linux__)
40
#define OS_LINUX
41
#elif defined(_WIN32)
42
#define OS_WIN32
43
#elif defined(__FreeBSD__)
44
#define OS_FREEBSD
45
#elif defined(__APPLE__)
46
#define OS_DARWIN
47
#else
48
#error "Target not supported."
49
#endif
50
51
#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_DARWIN)
52
#define OS_POSIX
53
#endif
54
55
#if defined(OS_LINUX)
56
#if defined(__TIZEN__)
57
#define PLATFORM_TIZEN
58
#elif defined(__ANDROID__)
59
#define PLATFORM_ANDROID
60
#endif
61
#elif defined(OS_WIN32)
62
#if defined(__MINGW32__)
63
#define PLATFORM_MINGW
64
#endif
65
#endif
66
67
#if defined(__arm__) || defined(_M_ARM)
68
#define ARCH_ARM
69
#define BITSIZE_32
70
#elif defined(__aarch64__) || defined(_M_ARM64)
71
#define ARCH_ARM64
72
#define BITSIZE_64
73
#elif defined(__i386__) || defined(_M_IX86)
74
#define ARCH_X86
75
#define BITSIZE_32
76
#elif defined(__x86_64__) || defined(_M_AMD64)
77
#define ARCH_X86_64
78
#define BITSIZE_64
79
#elif defined(__riscv)
80
#define ARCH_RISCV
81
#if __riscv_xlen == 32
82
#define BITSIZE_32
83
#elif __riscv_xlen == 64
84
#define BITSIZE_64
85
#elif __riscv_xlen == 128
86
#define BITSIZE_128
87
#endif
88
#else
89
#error "Architecture not supported."
90
#endif
91
92
#if defined(COMPILER_MSVC)
93
#define ENDIAN_LITTLE
94
#else
95
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
96
#define ENDIAN_LITTLE
97
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
98
#define ENDIAN_BIG
99
#elif __BYTE_ORDER__ == __ORDER_PDP_ENDIAN__
100
#define ENDIAN_MIDDLE
101
#else
102
#error "Unknown endianness."
103
#endif
104
#endif
105
106
// We use this weird array_sizeof implementation to get the number of elements
107
// in an array in two cases we care about:
108
// 1) simple static arrays (e.g.: int foo[10]);
109
// 2) more complex structures that have a static array member but use an
110
// overload of operator[] to access data, and apply some transforms to the
111
// index passed. This happens in CPUState functions.
112
//
113
// array_sizeof is enabled only if the argument is not a pointer (to avoid the
114
// classic sizeof(pointer) bug), and if the argument is a POD type (to avoid
115
// users doing array_sizeof(my_std_vector) and such. The idea is that if a type
116
// overloads operator[] and is a POD, the underlying storage is probably in the
117
// structure, and not held as a reference or a pointer.
118
template
<
typename
T>
119
typename
std::enable_if<
120
!std::is_pointer<T>::value && std::is_pod<T>::value,
121
size_t
>::type
static
inline
constexpr
array_sizeof(T
const
&array) {
122
return
sizeof
(array) / (
reinterpret_cast<
uintptr_t
>
(&array[1]) -
123
reinterpret_cast<
uintptr_t
>
(&array[0]));
124
}
125
126
namespace
ds2 {
127
// Wrapper to allow classes with protected constructors to call
128
// `make_protected_unique` to construct a `unique_ptr` cleanly (which calls
129
// `make_unique` internally). Without this, classes with protected constructors
130
// cannot be `make_unique`'d.
131
template
<
typename
T>
struct
make_unique_enabler
{
132
struct
make_unique_enabler_helper :
public
T {
133
template
<
typename
... Args>
134
make_unique_enabler_helper(Args... args) : T(std::forward<Args>(args)...) {}
135
};
136
137
template
<
typename
... Args>
138
static
std::unique_ptr<T> make_protected_unique(Args... args) {
139
return
std::make_unique<make_unique_enabler_helper>(
140
std::forward<Args>(args)...);
141
}
142
};
143
}
// namespace ds2
ds2::make_unique_enabler
Definition
Base.h:131
Generated by
1.13.2