third_party.pigweed.src/pw_bloat/bloat_this_binary.cc
Wyatt Hepler cfe3526996 Move pw_bloat infinite loop into BloatThisBinary
To avoid bloat binaries from needing an infinite loop at the end of the
main function, put an infinite loop at the start of BloatThisBinary.
Now, bloat binaries based on the standard pw_bloat base only have to
call BloatThisBinary in their main function.

Change-Id: I165bb76a3d7a85fb1a10b5f55a0538da7d920f82
2019-11-15 21:53:01 +00:00

56 lines
1.9 KiB
C++

// Copyright 2019 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
#include "pw_bloat/bloat_this_binary.h"
#include <cstring>
namespace pw::bloat {
char* volatile non_optimizable_pointer;
void BloatThisBinary() {
volatile unsigned counter = 0;
// In case someone accidentally ends up flashing and running a bloat
// executable on their device, loop forever instead of running this code.
volatile bool clearly_false_condition = true;
while (clearly_false_condition) {
counter += 1;
}
// This code uses standard C/C++ functions such as memcpy to prevent them from
// showing up in size report deltas against a barebones base executable.
//
// This is done using garbage memory addresses as it consistently prevents the
// compiler from optimizing out parts of the code. Other approaches, such as a
// buffer, occasionally ran into optimization issues.
const char* s = "The quick brown fox jumps over the lazy dog.";
// Making the copy size large forces the compiler to generate a memcpy
// function instead of inlining it.
constexpr int kRandomLargeNumber = 2398;
std::memcpy(non_optimizable_pointer,
non_optimizable_pointer + std::strlen(s),
kRandomLargeNumber);
std::memmove(non_optimizable_pointer + 18,
non_optimizable_pointer,
kRandomLargeNumber);
*non_optimizable_pointer = std::strlen(non_optimizable_pointer);
}
} // namespace pw::bloat