// 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>

#include "pw_assert/assert.h"
#include "pw_assert/check.h"
#include "pw_log/log.h"

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);

  // This code ensures users do not have to pay for the base cost of using
  // asserts and logging.
  PW_ASSERT(*non_optimizable_pointer);
  PW_DASSERT(*non_optimizable_pointer);
  PW_CHECK_INT_GE(*non_optimizable_pointer, 0, "Ensure this logic stays");
  PW_DCHECK_INT_GE(*non_optimizable_pointer, 0, "Ensure this logic stays");
  PW_LOG_INFO("We care about optimizing: %d", *non_optimizable_pointer);
}

}  // namespace pw::bloat
