blob: 3e786f08677fafbfe082c48983e6543748bb9f44 [file] [log] [blame]
diff --git a/base/third_party/symbolize/demangle.cc b/base/third_party/symbolize/demangle.cc
index 2632646dd4072..8db75f01071e2 100644
--- a/base/third_party/symbolize/demangle.cc
+++ b/base/third_party/symbolize/demangle.cc
@@ -139,8 +139,8 @@ static const AbbrevPair kBuiltinTypeList[] = {
{"g", "__float128", 0},
{"z", "ellipsis", 0},
- {"De", "decimal128", 0}, // IEEE 754r decimal floating point (128 bits)
- {"Dd", "decimal64", 0}, // IEEE 754r decimal floating point (64 bits)
+ {"De", "decimal128", 0}, // IEEE 754r decimal floating point (128 bits)
+ {"Dd", "decimal64", 0}, // IEEE 754r decimal floating point (64 bits)
{"Dc", "decltype(auto)", 0},
{"Da", "auto", 0},
{"Dn", "std::nullptr_t", 0}, // i.e., decltype(nullptr)
@@ -148,7 +148,7 @@ static const AbbrevPair kBuiltinTypeList[] = {
{"Di", "char32_t", 0},
{"Du", "char8_t", 0},
{"Ds", "char16_t", 0},
- {"Dh", "float16", 0}, // IEEE 754r half-precision float (16 bits)
+ {"Dh", "float16", 0}, // IEEE 754r half-precision float (16 bits)
{nullptr, nullptr, 0},
};
@@ -193,8 +193,8 @@ static_assert(sizeof(ParseState) == 4 * sizeof(int),
// Only one copy of this exists for each call to Demangle, so the size of this
// struct is nearly inconsequential.
typedef struct {
- const char *mangled_begin; // Beginning of input string.
- char *out; // Beginning of output string.
+ const char* mangled_begin; // Beginning of input string.
+ char* out; // Beginning of output string.
int out_end_idx; // One past last allowed output character.
int recursion_depth; // For stack exhaustion prevention.
int steps; // Cap how much work we'll do, regardless of depth.
@@ -206,7 +206,7 @@ namespace {
// Also prevent unbounded handling of complex inputs.
class ComplexityGuard {
public:
- explicit ComplexityGuard(State *state) : state_(state) {
+ explicit ComplexityGuard(State* state) : state_(state) {
++state->recursion_depth;
++state->steps;
}
@@ -239,7 +239,7 @@ class ComplexityGuard {
}
private:
- State *state_;
+ State* state_;
};
} // namespace
@@ -255,7 +255,7 @@ static size_t StrLen(const char *str) {
}
// Returns true if "str" has at least "n" characters remaining.
-static bool AtLeastNumCharsRemaining(const char *str, size_t n) {
+static bool AtLeastNumCharsRemaining(const char* str, size_t n) {
for (size_t i = 0; i < n; ++i) {
if (str[i] == '\0') {
return false;
@@ -291,7 +291,7 @@ static void InitState(State* state,
state->parse_state.append = true;
}
-static inline const char *RemainingInput(State *state) {
+static inline const char* RemainingInput(State* state) {
return &state->mangled_begin[state->parse_state.mangled_idx];
}
@@ -300,7 +300,9 @@ static inline const char *RemainingInput(State *state) {
// not contain '\0'.
static bool ParseOneCharToken(State *state, const char one_char_token) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (RemainingInput(state)[0] == one_char_token) {
++state->parse_state.mangled_idx;
return true;
@@ -313,7 +315,9 @@ static bool ParseOneCharToken(State *state, const char one_char_token) {
// not contain '\0'.
static bool ParseTwoCharToken(State *state, const char *two_char_token) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (RemainingInput(state)[0] == two_char_token[0] &&
RemainingInput(state)[1] == two_char_token[1]) {
state->parse_state.mangled_idx += 2;
@@ -326,7 +330,9 @@ static bool ParseTwoCharToken(State *state, const char *two_char_token) {
// "char_class" at "mangled_cur" position.
static bool ParseCharClass(State *state, const char *char_class) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (RemainingInput(state)[0] == '\0') {
return false;
}
@@ -340,7 +346,7 @@ static bool ParseCharClass(State *state, const char *char_class) {
return false;
}
-static bool ParseDigit(State *state, int *digit) {
+static bool ParseDigit(State* state, int* digit) {
char c = RemainingInput(state)[0];
if (ParseCharClass(state, "0123456789")) {
if (digit != nullptr) {
@@ -352,7 +358,9 @@ static bool ParseDigit(State *state, int *digit) {
}
// This function is used for handling an optional non-terminal.
-static bool Optional(bool /*status*/) { return true; }
+static bool Optional(bool /*status*/) {
+ return true;
+}
// This function is used for handling <non-terminal>+ syntax.
typedef bool (*ParseFunc)(State *);
@@ -378,7 +386,7 @@ static bool ZeroOrMore(ParseFunc parse_func, State *state) {
// Append "str" at "out_cur_idx". If there is an overflow, out_cur_idx is
// set to out_end_idx+1. The output string is ensured to
// always terminate with '\0' as long as there is no overflow.
-static void Append(State *state, const char *const str, const size_t length) {
+static void Append(State* state, const char* const str, const size_t length) {
for (size_t i = 0; i < length; ++i) {
if (state->parse_state.out_cur_idx + 1 <
state->out_end_idx) { // +1 for '\0'
@@ -396,13 +404,17 @@ static void Append(State *state, const char *const str, const size_t length) {
}
// We don't use equivalents in libc to avoid locale issues.
-static bool IsLower(char c) { return c >= 'a' && c <= 'z'; }
+static bool IsLower(char c) {
+ return c >= 'a' && c <= 'z';
+}
static bool IsAlpha(char c) {
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
-static bool IsDigit(char c) { return c >= '0' && c <= '9'; }
+static bool IsDigit(char c) {
+ return c >= '0' && c <= '9';
+}
// Returns true if "str" is a function clone suffix. These suffixes are used
// by GCC 4.5.x and later versions (and our locally-modified version of GCC
@@ -428,20 +440,22 @@ static bool IsFunctionCloneSuffix(const char *str) {
++i;
}
}
- if (!parsed)
+ if (!parsed) {
return false;
+ }
}
return true; // Consumed everything in "str".
}
-static bool EndsWith(State *state, const char chr) {
+static bool EndsWith(State* state, const char chr) {
return state->parse_state.out_cur_idx > 0 &&
state->parse_state.out_cur_idx < state->out_end_idx &&
chr == state->out[state->parse_state.out_cur_idx - 1];
}
// Append "str" with some tweaks, iff "append" state is true.
-static void MaybeAppendWithLength(State *state, const char *const str,
+static void MaybeAppendWithLength(State* state,
+ const char* const str,
const size_t length) {
if (state->parse_state.append && length > 0) {
// Append a space if the output buffer ends with '<' and "str"
@@ -461,7 +475,7 @@ static void MaybeAppendWithLength(State *state, const char *const str,
}
// Appends a positive decimal number to the output if appending is enabled.
-static bool MaybeAppendDecimal(State *state, int val) {
+static bool MaybeAppendDecimal(State* state, int val) {
// Max {32-64}-bit unsigned int is 20 digits.
constexpr size_t kMaxLength = 20;
char buf[kMaxLength];
@@ -471,7 +485,7 @@ static bool MaybeAppendDecimal(State *state, int val) {
if (state->parse_state.append) {
// We can't have a one-before-the-beginning pointer, so instead start with
// one-past-the-end and manipulate one character before the pointer.
- char *p = &buf[kMaxLength];
+ char* p = &buf[kMaxLength];
do { // val=0 is the only input that should write a leading zero digit.
*--p = static_cast<char>((val % 10) + '0');
val /= 10;
@@ -486,7 +500,7 @@ static bool MaybeAppendDecimal(State *state, int val) {
// A convenient wrapper around MaybeAppendWithLength().
// Returns true so that it can be placed in "if" conditions.
-static bool MaybeAppend(State *state, const char *const str) {
+static bool MaybeAppend(State* state, const char* const str) {
if (state->parse_state.append) {
size_t length = StrLen(str);
MaybeAppendWithLength(state, str, length);
@@ -501,7 +515,7 @@ static bool EnterNestedName(State *state) {
}
// This function is used for handling nested names.
-static bool LeaveNestedName(State *state, int16_t prev_value) {
+static bool LeaveNestedName(State* state, int16_t prev_value) {
state->parse_state.nest_level = prev_value;
return true;
}
@@ -543,7 +557,7 @@ static void MaybeCancelLastSeparator(State *state) {
// Returns true if the identifier of the given length pointed to by
// "mangled_cur" is anonymous namespace.
-static bool IdentifierIsAnonymousNamespace(State *state, size_t length) {
+static bool IdentifierIsAnonymousNamespace(State* state, size_t length) {
// Returns true if "anon_prefix" is a proper prefix of "mangled_cur".
static const char anon_prefix[] = "_GLOBAL__N_";
return (length > (sizeof(anon_prefix) - 1) &&
@@ -554,25 +568,25 @@ static bool IdentifierIsAnonymousNamespace(State *state, size_t length) {
static bool ParseMangledName(State *state);
static bool ParseEncoding(State *state);
static bool ParseName(State *state);
-static bool ParseUnscopedName(State *state);
+static bool ParseUnscopedName(State* state);
static bool ParseNestedName(State *state);
static bool ParsePrefix(State *state);
static bool ParseUnqualifiedName(State *state);
static bool ParseSourceName(State *state);
static bool ParseLocalSourceName(State *state);
-static bool ParseUnnamedTypeName(State *state);
+static bool ParseUnnamedTypeName(State* state);
static bool ParseNumber(State *state, int *number_out);
static bool ParseFloatNumber(State *state);
static bool ParseSeqId(State *state);
-static bool ParseIdentifier(State *state, size_t length);
-static bool ParseOperatorName(State *state, int *arity);
+static bool ParseIdentifier(State* state, size_t length);
+static bool ParseOperatorName(State* state, int* arity);
static bool ParseSpecialName(State *state);
static bool ParseCallOffset(State *state);
static bool ParseNVOffset(State *state);
static bool ParseVOffset(State *state);
-static bool ParseAbiTags(State *state);
+static bool ParseAbiTags(State* state);
static bool ParseCtorDtorName(State *state);
-static bool ParseDecltype(State *state);
+static bool ParseDecltype(State* state);
static bool ParseType(State *state);
static bool ParseCVQualifiers(State *state);
static bool ParseBuiltinType(State *state);
@@ -585,15 +599,15 @@ static bool ParseTemplateParam(State *state);
static bool ParseTemplateTemplateParam(State *state);
static bool ParseTemplateArgs(State *state);
static bool ParseTemplateArg(State *state);
-static bool ParseBaseUnresolvedName(State *state);
-static bool ParseUnresolvedName(State *state);
+static bool ParseBaseUnresolvedName(State* state);
+static bool ParseUnresolvedName(State* state);
static bool ParseExpression(State *state);
static bool ParseExprPrimary(State *state);
-static bool ParseExprCastValue(State *state);
+static bool ParseExprCastValue(State* state);
static bool ParseLocalName(State *state);
-static bool ParseLocalNameSuffix(State *state);
+static bool ParseLocalNameSuffix(State* state);
static bool ParseDiscriminator(State *state);
-static bool ParseSubstitution(State *state, bool accept_std);
+static bool ParseSubstitution(State* state, bool accept_std);
// Implementation note: the following code is a straightforward
// translation of the Itanium C++ ABI defined in BNF with a couple of
@@ -629,7 +643,9 @@ static bool ParseSubstitution(State *state, bool accept_std);
// <mangled-name> ::= _Z <encoding>
static bool ParseMangledName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
return ParseTwoCharToken(state, "_Z") && ParseEncoding(state);
}
@@ -638,7 +654,9 @@ static bool ParseMangledName(State *state) {
// ::= <special-name>
static bool ParseEncoding(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
// Implementing the first two productions together as <name>
// [<bare-function-type>] avoids exponential blowup of backtracking.
//
@@ -660,7 +678,9 @@ static bool ParseEncoding(State *state) {
// ::= <local-name>
static bool ParseName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseNestedName(state) || ParseLocalName(state)) {
return true;
}
@@ -690,7 +710,9 @@ static bool ParseName(State *state) {
// ::= St <unqualified-name>
static bool ParseUnscopedName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseUnqualifiedName(state)) {
return true;
}
@@ -706,7 +728,7 @@ static bool ParseUnscopedName(State *state) {
// <ref-qualifer> ::= R // lvalue method reference qualifier
// ::= O // rvalue method reference qualifier
-static inline bool ParseRefQualifier(State *state) {
+static inline bool ParseRefQualifier(State* state) {
return ParseCharClass(state, "OR");
}
@@ -716,7 +738,9 @@ static inline bool ParseRefQualifier(State *state) {
// <template-args> E
static bool ParseNestedName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'N') && EnterNestedName(state) &&
Optional(ParseCVQualifiers(state)) &&
@@ -742,7 +766,9 @@ static bool ParseNestedName(State *state) {
// ::= <substitution>
static bool ParsePrefix(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
bool has_something = false;
while (true) {
MaybeAppendSeparator(state);
@@ -773,7 +799,9 @@ static bool ParsePrefix(State *state) {
// <local-source-name> is a GCC extension; see below.
static bool ParseUnqualifiedName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseOperatorName(state, nullptr) || ParseCtorDtorName(state) ||
ParseSourceName(state) || ParseLocalSourceName(state) ||
ParseUnnamedTypeName(state)) {
@@ -784,9 +812,11 @@ static bool ParseUnqualifiedName(State *state) {
// <abi-tags> ::= <abi-tag> [<abi-tags>]
// <abi-tag> ::= B <source-name>
-static bool ParseAbiTags(State *state) {
+static bool ParseAbiTags(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
while (ParseOneCharToken(state, 'B')) {
ParseState copy = state->parse_state;
@@ -805,7 +835,9 @@ static bool ParseAbiTags(State *state) {
// <source-name> ::= <positive length number> <identifier>
static bool ParseSourceName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
int length = -1;
if (ParseNumber(state, &length) &&
@@ -823,7 +855,9 @@ static bool ParseSourceName(State *state) {
// https://gcc.gnu.org/viewcvs?view=rev&revision=124467
static bool ParseLocalSourceName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'L') && ParseSourceName(state) &&
Optional(ParseDiscriminator(state))) {
@@ -837,9 +871,11 @@ static bool ParseLocalSourceName(State *state) {
// ::= <closure-type-name>
// <closure-type-name> ::= Ul <lambda-sig> E [<(nonnegative) number>] _
// <lambda-sig> ::= <(parameter) type>+
-static bool ParseUnnamedTypeName(State *state) {
+static bool ParseUnnamedTypeName(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
// Type's 1-based index n is encoded as { "", n == 1; itoa(n-2), otherwise }.
// Optionally parse the encoded value into 'which' and add 2 to get the index.
@@ -878,12 +914,14 @@ static bool ParseUnnamedTypeName(State *state) {
// parsed number on success.
static bool ParseNumber(State *state, int *number_out) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
bool negative = false;
if (ParseOneCharToken(state, 'n')) {
negative = true;
}
- const char *p = RemainingInput(state);
+ const char* p = RemainingInput(state);
uint64_t number = 0;
for (; *p != '\0'; ++p) {
if (IsDigit(*p)) {
@@ -913,8 +951,10 @@ static bool ParseNumber(State *state, int *number_out) {
// hexadecimal string.
static bool ParseFloatNumber(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
- const char *p = RemainingInput(state);
+ if (guard.IsTooComplex()) {
+ return false;
+ }
+ const char* p = RemainingInput(state);
for (; *p != '\0'; ++p) {
if (!IsDigit(*p) && !(*p >= 'a' && *p <= 'f')) {
break;
@@ -931,8 +971,10 @@ static bool ParseFloatNumber(State *state) {
// using digits and upper case letters
static bool ParseSeqId(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
- const char *p = RemainingInput(state);
+ if (guard.IsTooComplex()) {
+ return false;
+ }
+ const char* p = RemainingInput(state);
for (; *p != '\0'; ++p) {
if (!IsDigit(*p) && !(*p >= 'A' && *p <= 'Z')) {
break;
@@ -946,9 +988,11 @@ static bool ParseSeqId(State *state) {
}
// <identifier> ::= <unqualified source code identifier> (of given length)
-static bool ParseIdentifier(State *state, size_t length) {
+static bool ParseIdentifier(State* state, size_t length) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (!AtLeastNumCharsRemaining(RemainingInput(state), length)) {
return false;
}
@@ -964,9 +1008,11 @@ static bool ParseIdentifier(State *state, size_t length) {
// <operator-name> ::= nw, and other two letters cases
// ::= cv <type> # (cast)
// ::= v <digit> <source-name> # vendor extended operator
-static bool ParseOperatorName(State *state, int *arity) {
+static bool ParseOperatorName(State* state, int* arity) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (!AtLeastNumCharsRemaining(RemainingInput(state), 2)) {
return false;
}
@@ -1036,7 +1082,9 @@ static bool ParseOperatorName(State *state, int *arity) {
// stack traces. The are special data.
static bool ParseSpecialName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "VTISH") &&
ParseType(state)) {
@@ -1098,7 +1146,9 @@ static bool ParseSpecialName(State *state) {
// ::= v <v-offset> _
static bool ParseCallOffset(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'h') && ParseNVOffset(state) &&
ParseOneCharToken(state, '_')) {
@@ -1118,14 +1168,18 @@ static bool ParseCallOffset(State *state) {
// <nv-offset> ::= <(offset) number>
static bool ParseNVOffset(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
return ParseNumber(state, nullptr);
}
// <v-offset> ::= <(offset) number> _ <(virtual offset) number>
static bool ParseVOffset(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseNumber(state, nullptr) && ParseOneCharToken(state, '_') &&
ParseNumber(state, nullptr)) {
@@ -1144,11 +1198,13 @@ static bool ParseVOffset(State *state) {
// ::= C4 | D4
static bool ParseCtorDtorName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'C')) {
if (ParseCharClass(state, "1234")) {
- const char *const prev_name =
+ const char* const prev_name =
state->out + state->parse_state.prev_name_idx;
MaybeAppendWithLength(state, prev_name,
state->parse_state.prev_name_length);
@@ -1161,7 +1217,7 @@ static bool ParseCtorDtorName(State *state) {
state->parse_state = copy;
if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "0124")) {
- const char *const prev_name = state->out + state->parse_state.prev_name_idx;
+ const char* const prev_name = state->out + state->parse_state.prev_name_idx;
MaybeAppend(state, "~");
MaybeAppendWithLength(state, prev_name,
state->parse_state.prev_name_length);
@@ -1174,9 +1230,11 @@ static bool ParseCtorDtorName(State *state) {
// <decltype> ::= Dt <expression> E # decltype of an id-expression or class
// # member access (C++0x)
// ::= DT <expression> E # decltype of an expression (C++0x)
-static bool ParseDecltype(State *state) {
+static bool ParseDecltype(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") &&
@@ -1209,7 +1267,9 @@ static bool ParseDecltype(State *state) {
//
static bool ParseType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
// We should check CV-qualifers, and PRGC things first.
@@ -1227,7 +1287,9 @@ static bool ParseType(State *state) {
// By consuming the CV-qualifiers first, the former parse is disabled.
if (ParseCVQualifiers(state)) {
const bool result = ParseType(state);
- if (!result) state->parse_state = copy;
+ if (!result) {
+ state->parse_state = copy;
+ }
return result;
}
state->parse_state = copy;
@@ -1238,7 +1300,9 @@ static bool ParseType(State *state) {
// refusing to backtrack the tag characters.
if (ParseCharClass(state, "OPRCG")) {
const bool result = ParseType(state);
- if (!result) state->parse_state = copy;
+ if (!result) {
+ state->parse_state = copy;
+ }
return result;
}
state->parse_state = copy;
@@ -1286,7 +1350,9 @@ static bool ParseType(State *state) {
// ParseType().
static bool ParseCVQualifiers(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
int num_cv_qualifiers = 0;
num_cv_qualifiers += ParseOneCharToken(state, 'r');
num_cv_qualifiers += ParseOneCharToken(state, 'V');
@@ -1303,7 +1369,9 @@ static bool ParseCVQualifiers(State *state) {
//
static bool ParseBuiltinType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
const AbbrevPair *p;
for (p = kBuiltinTypeList; p->abbrev != nullptr; ++p) {
// Guaranteed only 1- or 2-character strings in kBuiltinTypeList.
@@ -1333,11 +1401,15 @@ static bool ParseBuiltinType(State *state) {
// noexcept
// ::= Dw <type>+ E # dynamic exception specification
// with instantiation-dependent types
-static bool ParseExceptionSpec(State *state) {
+static bool ParseExceptionSpec(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
- if (ParseTwoCharToken(state, "Do")) return true;
+ if (ParseTwoCharToken(state, "Do")) {
+ return true;
+ }
ParseState copy = state->parse_state;
if (ParseTwoCharToken(state, "DO") && ParseExpression(state) &&
@@ -1357,7 +1429,9 @@ static bool ParseExceptionSpec(State *state) {
// <function-type> ::= [exception-spec] F [Y] <bare-function-type> [O] E
static bool ParseFunctionType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (Optional(ParseExceptionSpec(state)) && ParseOneCharToken(state, 'F') &&
Optional(ParseOneCharToken(state, 'Y')) && ParseBareFunctionType(state) &&
@@ -1372,7 +1446,9 @@ static bool ParseFunctionType(State *state) {
// <bare-function-type> ::= <(signature) type>+
static bool ParseBareFunctionType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
DisableAppend(state);
if (OneOrMore(ParseType, state)) {
@@ -1387,7 +1463,9 @@ static bool ParseBareFunctionType(State *state) {
// <class-enum-type> ::= <name>
static bool ParseClassEnumType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
return ParseName(state);
}
@@ -1395,7 +1473,9 @@ static bool ParseClassEnumType(State *state) {
// ::= A [<(dimension) expression>] _ <(element) type>
static bool ParseArrayType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'A') && ParseNumber(state, nullptr) &&
ParseOneCharToken(state, '_') && ParseType(state)) {
@@ -1414,7 +1494,9 @@ static bool ParseArrayType(State *state) {
// <pointer-to-member-type> ::= M <(class) type> <(member) type>
static bool ParsePointerToMemberType(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'M') && ParseType(state) && ParseType(state)) {
return true;
@@ -1427,7 +1509,9 @@ static bool ParsePointerToMemberType(State *state) {
// ::= T <parameter-2 non-negative number> _
static bool ParseTemplateParam(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseTwoCharToken(state, "T_")) {
MaybeAppend(state, "?"); // We don't support template substitutions.
return true;
@@ -1447,7 +1531,9 @@ static bool ParseTemplateParam(State *state) {
// ::= <substitution>
static bool ParseTemplateTemplateParam(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
return (ParseTemplateParam(state) ||
// "std" on its own isn't a template.
ParseSubstitution(state, /*accept_std=*/false));
@@ -1456,7 +1542,9 @@ static bool ParseTemplateTemplateParam(State *state) {
// <template-args> ::= I <template-arg>+ E
static bool ParseTemplateArgs(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
DisableAppend(state);
if (ParseOneCharToken(state, 'I') && OneOrMore(ParseTemplateArg, state) &&
@@ -1475,7 +1563,9 @@ static bool ParseTemplateArgs(State *state) {
// ::= X <expression> E
static bool ParseTemplateArg(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'J') && ZeroOrMore(ParseTemplateArg, state) &&
ParseOneCharToken(state, 'E')) {
@@ -1578,14 +1668,14 @@ static bool ParseTemplateArg(State *state) {
// <unresolved-type> ::= <template-param> [<template-args>]
// ::= <decltype>
// ::= <substitution>
-static inline bool ParseUnresolvedType(State *state) {
+static inline bool ParseUnresolvedType(State* state) {
// No ComplexityGuard because we don't copy the state in this stack frame.
return (ParseTemplateParam(state) && Optional(ParseTemplateArgs(state))) ||
ParseDecltype(state) || ParseSubstitution(state, /*accept_std=*/false);
}
// <simple-id> ::= <source-name> [<template-args>]
-static inline bool ParseSimpleId(State *state) {
+static inline bool ParseSimpleId(State* state) {
// No ComplexityGuard because we don't copy the state in this stack frame.
// Note: <simple-id> cannot be followed by a parameter pack; see comment in
@@ -1596,9 +1686,11 @@ static inline bool ParseSimpleId(State *state) {
// <base-unresolved-name> ::= <source-name> [<template-args>]
// ::= on <operator-name> [<template-args>]
// ::= dn <destructor-name>
-static bool ParseBaseUnresolvedName(State *state) {
+static bool ParseBaseUnresolvedName(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseSimpleId(state)) {
return true;
@@ -1626,9 +1718,11 @@ static bool ParseBaseUnresolvedName(State *state) {
// <base-unresolved-name>
// ::= [gs] sr <unresolved-qualifier-level>+ E
// <base-unresolved-name>
-static bool ParseUnresolvedName(State *state) {
+static bool ParseUnresolvedName(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (Optional(ParseTwoCharToken(state, "gs")) &&
@@ -1684,7 +1778,9 @@ static bool ParseUnresolvedName(State *state) {
// ::= fL <number> p <(top-level) CV-qualifiers> <number> _
static bool ParseExpression(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseTemplateParam(state) || ParseExprPrimary(state)) {
return true;
}
@@ -1817,7 +1913,9 @@ static bool ParseExpression(State *state) {
// casts to <local-name> types.
static bool ParseExprPrimary(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
// The "LZ" special case: if we see LZ, we commit to accept "LZ <encoding> E"
@@ -1848,9 +1946,11 @@ static bool ParseExprPrimary(State *state) {
}
// <number> or <float>, followed by 'E', as described above ParseExprPrimary.
-static bool ParseExprCastValue(State *state) {
+static bool ParseExprCastValue(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
// We have to be able to backtrack after accepting a number because we could
// have e.g. "7fffE", which will accept "7" as a number but then fail to find
// the 'E'.
@@ -1877,9 +1977,11 @@ static bool ParseExprCastValue(State *state) {
// <local-name-suffix> ::= s [<discriminator>]
// ::= <name> [<discriminator>]
-static bool ParseLocalNameSuffix(State *state) {
+static bool ParseLocalNameSuffix(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (MaybeAppend(state, "::") && ParseName(state) &&
Optional(ParseDiscriminator(state))) {
@@ -1896,9 +1998,11 @@ static bool ParseLocalNameSuffix(State *state) {
return ParseOneCharToken(state, 's') && Optional(ParseDiscriminator(state));
}
-static bool ParseLocalName(State *state) {
+static bool ParseLocalName(State* state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) &&
ParseOneCharToken(state, 'E') && ParseLocalNameSuffix(state)) {
@@ -1911,7 +2015,9 @@ static bool ParseLocalName(State *state) {
// <discriminator> := _ <(non-negative) number>
static bool ParseDiscriminator(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
ParseState copy = state->parse_state;
if (ParseOneCharToken(state, '_') && ParseNumber(state, nullptr)) {
return true;
@@ -1931,9 +2037,11 @@ static bool ParseDiscriminator(State *state) {
// an unqualified name and re-parse the same template-args. To block this
// exponential backtracking, we disable it with 'accept_std=false' in
// problematic contexts.
-static bool ParseSubstitution(State *state, bool accept_std) {
+static bool ParseSubstitution(State* state, bool accept_std) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseTwoCharToken(state, "S_")) {
MaybeAppend(state, "?"); // We don't support substitutions.
return true;
@@ -1971,7 +2079,9 @@ static bool ParseSubstitution(State *state, bool accept_std) {
// or version suffix. Returns true only if all of "mangled_cur" was consumed.
static bool ParseTopLevelMangledName(State *state) {
ComplexityGuard guard(state);
- if (guard.IsTooComplex()) return false;
+ if (guard.IsTooComplex()) {
+ return false;
+ }
if (ParseMangledName(state)) {
if (RemainingInput(state)[0] != '\0') {
// Drop trailing function clone suffix, if any.
@@ -1991,13 +2101,13 @@ static bool ParseTopLevelMangledName(State *state) {
return false;
}
-static bool Overflowed(const State *state) {
+static bool Overflowed(const State* state) {
return state->parse_state.out_cur_idx >= state->out_end_idx;
}
#endif
// The demangler entry point.
-bool Demangle(const char *mangled, char *out, size_t out_size) {
+bool Demangle(const char* mangled, char* out, size_t out_size) {
#if defined(GLOG_OS_WINDOWS)
#if defined(HAVE_DBGHELP)
// When built with incremental linking, the Windows debugger
diff --git a/base/third_party/symbolize/demangle.h b/base/third_party/symbolize/demangle.h
index 26e821a53c2cb..7d5cfaaabf0dd 100644
--- a/base/third_party/symbolize/demangle.h
+++ b/base/third_party/symbolize/demangle.h
@@ -80,7 +80,7 @@ _START_GOOGLE_NAMESPACE_
// Demangle "mangled". On success, return true and write the
// demangled symbol name to "out". Otherwise, return false.
// "out" is modified even if demangling is unsuccessful.
-bool GLOG_EXPORT Demangle(const char *mangled, char *out, size_t out_size);
+bool GLOG_EXPORT Demangle(const char* mangled, char* out, size_t out_size);
_END_GOOGLE_NAMESPACE_
diff --git a/base/third_party/symbolize/glog/logging.h b/base/third_party/symbolize/glog/logging.h
index 46869226024da..b935e3ec9cded 100644
--- a/base/third_party/symbolize/glog/logging.h
+++ b/base/third_party/symbolize/glog/logging.h
@@ -38,4 +38,4 @@
// Not needed in Chrome.
-#endif // GLOG_LOGGING_H
+#endif // GLOG_LOGGING_H
diff --git a/base/third_party/symbolize/symbolize.cc b/base/third_party/symbolize/symbolize.cc
index b6ddc85d57185..a3b8399f411bf 100644
--- a/base/third_party/symbolize/symbolize.cc
+++ b/base/third_party/symbolize/symbolize.cc
@@ -97,7 +97,7 @@ void InstallSymbolizeOpenObjectFileCallback(
// where the input symbol is demangled in-place.
// To keep stack consumption low, we would like this function to not
// get inlined.
-static ATTRIBUTE_NOINLINE void DemangleInplace(char *out, size_t out_size) {
+static ATTRIBUTE_NOINLINE void DemangleInplace(char* out, size_t out_size) {
char demangled[256]; // Big enough for sane demangled symbols.
if (Demangle(out, demangled, sizeof(demangled))) {
// Demangling succeeded. Copy to out if the space allows.
@@ -121,17 +121,17 @@ _END_GOOGLE_NAMESPACE_
#else
#include <elf.h>
#endif
+#include <fcntl.h>
+#include <stdint.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
#include <cerrno>
#include <climits>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
-#include <fcntl.h>
-#include <stdint.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
#include "symbolize.h"
#include "config.h"
@@ -153,7 +153,8 @@ ssize_t ReadFromOffset(const int fd,
const size_t count,
const size_t offset) {
SAFE_ASSERT(fd >= 0);
- SAFE_ASSERT(count <= static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
+ SAFE_ASSERT(count <=
+ static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
char *buf0 = reinterpret_cast<char *>(buf);
size_t num_bytes = 0;
while (num_bytes < count) {
@@ -176,8 +177,10 @@ ssize_t ReadFromOffset(const int fd,
// pointed by "fd" into the buffer starting at "buf" while handling
// short reads and EINTR. On success, return true. Otherwise, return
// false.
-static bool ReadFromOffsetExact(const int fd, void *buf,
- const size_t count, const size_t offset) {
+static bool ReadFromOffsetExact(const int fd,
+ void* buf,
+ const size_t count,
+ const size_t offset) {
ssize_t len = ReadFromOffset(fd, buf, count, offset);
return static_cast<size_t>(len) == count;
}
@@ -199,9 +202,11 @@ static int FileGetElfType(const int fd) {
// and return true. Otherwise, return false.
// To keep stack consumption low, we would like this function to not get
// inlined.
-static ATTRIBUTE_NOINLINE bool
-GetSectionHeaderByType(const int fd, ElfW(Half) sh_num, const size_t sh_offset,
- ElfW(Word) type, ElfW(Shdr) *out) {
+static ATTRIBUTE_NOINLINE bool GetSectionHeaderByType(const int fd,
+ ElfW(Half) sh_num,
+ const size_t sh_offset,
+ ElfW(Word) type,
+ ElfW(Shdr) * out) {
// Read at most 16 section headers at a time to save read calls.
ElfW(Shdr) buf[16];
for (size_t i = 0; i < sh_num;) {
@@ -248,8 +253,8 @@ bool GetSectionHeaderByName(int fd, const char *name, size_t name_len,
}
for (size_t i = 0; i < elf_header.e_shnum; ++i) {
- size_t section_header_offset = (elf_header.e_shoff +
- elf_header.e_shentsize * i);
+ size_t section_header_offset =
+ (elf_header.e_shoff + elf_header.e_shentsize * i);
if (!ReadFromOffsetExact(fd, out, sizeof(*out), section_header_offset)) {
return false;
}
@@ -281,10 +286,13 @@ bool GetSectionHeaderByName(int fd, const char *name, size_t name_len,
// to out. Otherwise, return false.
// To keep stack consumption low, we would like this function to not get
// inlined.
-static ATTRIBUTE_NOINLINE bool
-FindSymbol(uint64_t pc, const int fd, char *out, size_t out_size,
- uint64_t symbol_offset, const ElfW(Shdr) *strtab,
- const ElfW(Shdr) *symtab) {
+static ATTRIBUTE_NOINLINE bool FindSymbol(uint64_t pc,
+ const int fd,
+ char* out,
+ size_t out_size,
+ uint64_t symbol_offset,
+ const ElfW(Shdr) * strtab,
+ const ElfW(Shdr) * symtab) {
if (symtab == NULL) {
return false;
}
@@ -384,7 +392,7 @@ namespace {
// and snprintf().
class LineReader {
public:
- explicit LineReader(int fd, char *buf, size_t buf_len, size_t offset)
+ explicit LineReader(int fd, char* buf, size_t buf_len, size_t offset)
: fd_(fd),
buf_(buf),
buf_len_(buf_len),
@@ -449,11 +457,12 @@ class LineReader {
}
private:
- LineReader(const LineReader &);
+ LineReader(const LineReader&);
void operator=(const LineReader&);
char *FindLineFeed() {
- return reinterpret_cast<char *>(memchr(bol_, '\n', static_cast<size_t>(eod_ - bol_)));
+ return reinterpret_cast<char*>(
+ memchr(bol_, '\n', static_cast<size_t>(eod_ - bol_)));
}
bool BufferIsEmpty() {
@@ -483,7 +492,8 @@ static char *GetHex(const char *start, const char *end, uint64_t *hex) {
int ch = *p;
if ((ch >= '0' && ch <= '9') ||
(ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) {
- *hex = (*hex << 4U) | (ch < 'A' ? static_cast<uint64_t>(ch - '0') : (ch & 0xF) + 9U);
+ *hex = (*hex << 4U) |
+ (ch < 'A' ? static_cast<uint64_t>(ch - '0') : (ch & 0xF) + 9U);
} else { // Encountered the first non-hex character.
break;
}
@@ -647,12 +657,11 @@ static int OpenObjectFileContainingPcAndGetStartAddressNoHook(
}
}
-int OpenObjectFileContainingPcAndGetStartAddress(
- uint64_t pc,
- uint64_t& start_address,
- uint64_t& base_address,
- char* out_file_name,
- size_t out_file_name_size) {
+int OpenObjectFileContainingPcAndGetStartAddress(uint64_t pc,
+ uint64_t& start_address,
+ uint64_t& base_address,
+ char* out_file_name,
+ size_t out_file_name_size) {
if (g_symbolize_open_object_file_callback) {
return g_symbolize_open_object_file_callback(
pc, start_address, base_address, out_file_name, out_file_name_size);
@@ -668,7 +677,11 @@ int OpenObjectFileContainingPcAndGetStartAddress(
// bytes. Output will be truncated as needed, and a NUL character is always
// appended.
// NOTE: code from sandbox/linux/seccomp-bpf/demo.cc.
-static char *itoa_r(uintptr_t i, char *buf, size_t sz, unsigned base, size_t padding) {
+static char* itoa_r(uintptr_t i,
+ char* buf,
+ size_t sz,
+ unsigned base,
+ size_t padding) {
// Make sure we can write at least one NUL byte.
size_t n = 1;
if (n > sz) {
@@ -745,7 +758,8 @@ static void SafeAppendHexNumber(uint64_t value, char* dest, size_t dest_size) {
// and "out" is used as its output.
// To keep stack consumption low, we would like this function to not
// get inlined.
-static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,
+static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void* pc,
+ char* out,
size_t out_size) {
uint64_t pc0 = reinterpret_cast<uintptr_t>(pc);
uint64_t start_address = 0;
@@ -822,14 +836,16 @@ static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,
_END_GOOGLE_NAMESPACE_
-#elif (defined(GLOG_OS_MACOSX) || defined(GLOG_OS_EMSCRIPTEN)) && defined(HAVE_DLADDR)
+#elif (defined(GLOG_OS_MACOSX) || defined(GLOG_OS_EMSCRIPTEN)) && \
+ defined(HAVE_DLADDR)
#include <dlfcn.h>
#include <cstring>
_START_GOOGLE_NAMESPACE_
-static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,
+static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void* pc,
+ char* out,
size_t out_size) {
Dl_info info;
if (dladdr(pc, &info)) {
@@ -883,7 +899,8 @@ private:
SymInitializer& operator=(const SymInitializer&);
};
-static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out,
+static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void* pc,
+ char* out,
size_t out_size) {
const static SymInitializer symInitializer;
if (!symInitializer.ready) {
@@ -918,7 +935,7 @@ _END_GOOGLE_NAMESPACE_
_START_GOOGLE_NAMESPACE_
-bool Symbolize(void *pc, char *out, size_t out_size) {
+bool Symbolize(void* pc, char* out, size_t out_size) {
return SymbolizeAndDemangle(pc, out, out_size);
}
diff --git a/base/third_party/symbolize/symbolize.h b/base/third_party/symbolize/symbolize.h
index 64ff0509ce57d..987569fdde67f 100644
--- a/base/third_party/symbolize/symbolize.h
+++ b/base/third_party/symbolize/symbolize.h
@@ -127,7 +127,7 @@ ATTRIBUTE_NOINLINE int OpenObjectFileContainingPcAndGetStartAddress(
_END_GOOGLE_NAMESPACE_
-#endif /* __ELF__ */
+#endif /* __ELF__ */
_START_GOOGLE_NAMESPACE_
@@ -140,7 +140,7 @@ struct FileDescriptor {
int get() { return fd_; }
private:
- FileDescriptor(const FileDescriptor &);
+ FileDescriptor(const FileDescriptor&);
void operator=(const FileDescriptor&);
};
diff --git a/base/third_party/symbolize/utilities.h b/base/third_party/symbolize/utilities.h
index 8c61380fad159..bb206a8020315 100644
--- a/base/third_party/symbolize/utilities.h
+++ b/base/third_party/symbolize/utilities.h
@@ -35,13 +35,13 @@
#define UTILITIES_H__
#ifdef HAVE___ATTRIBUTE__
-# define ATTRIBUTE_NOINLINE __attribute__ ((noinline))
-# define HAVE_ATTRIBUTE_NOINLINE
+#define ATTRIBUTE_NOINLINE __attribute__((noinline))
+#define HAVE_ATTRIBUTE_NOINLINE
#elif defined(GLOG_OS_WINDOWS)
-# define ATTRIBUTE_NOINLINE __declspec(noinline)
-# define HAVE_ATTRIBUTE_NOINLINE
+#define ATTRIBUTE_NOINLINE __declspec(noinline)
+#define HAVE_ATTRIBUTE_NOINLINE
#else
-# define ATTRIBUTE_NOINLINE
+#define ATTRIBUTE_NOINLINE
#endif
#endif // UTILITIES_H__