// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/developer/debug/zxdb/expr/bitfield.h"

#include <gtest/gtest.h>

#include "src/developer/debug/zxdb/common/test_with_loop.h"
#include "src/developer/debug/zxdb/expr/eval_operators.h"
#include "src/developer/debug/zxdb/expr/expr_token.h"
#include "src/developer/debug/zxdb/expr/mock_eval_context.h"
#include "src/developer/debug/zxdb/expr/resolve_collection.h"
#include "src/developer/debug/zxdb/symbols/base_type.h"
#include "src/developer/debug/zxdb/symbols/collection.h"
#include "src/developer/debug/zxdb/symbols/data_member.h"
#include "src/developer/debug/zxdb/symbols/inherited_from.h"
#include "src/developer/debug/zxdb/symbols/modified_type.h"
#include "src/developer/debug/zxdb/symbols/type_test_support.h"

namespace zxdb {

namespace {

class Bitfield : public TestWithLoop {
 protected:
  ErrOrValue SyncEvalBinaryOperator(const fxl::RefPtr<EvalContext>& context, const ExprValue& left,
                                    ExprTokenType op, const ExprValue& right) {
    ErrOrValue result((ExprValue()));
    EvalBinaryOperator(context, left, ExprToken(op, "", 0), right,
                       [&result](ErrOrValue value) { result = value; });
    loop().RunUntilNoTasks();
    return result;
  }
};

}  // namespace

TEST_F(Bitfield, Bitfield) {
  auto eval_context = fxl::MakeRefCounted<MockEvalContext>();

  // Defines struct members that look like this:
  //   #pragma pack(push, 1)
  //   struct MyStruct {
  //     bool b1 : 1;
  //     bool b2 : 1;
  //     int i;  // To force things into other bytes.
  //     long long j : 3;
  //     unsigned k : 17;
  //   };
  // The values here are from copying the DWARF that the compiler generated from this struct.
  auto bool_type = fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeBoolean, 1, "bool");
  auto b1 = fxl::MakeRefCounted<DataMember>("b1", bool_type, 0);
  b1->set_byte_size(1);
  b1->set_bit_size(1);
  b1->set_bit_offset(7);

  auto b2 = fxl::MakeRefCounted<DataMember>("b2", bool_type, 0);
  b2->set_byte_size(1);
  b2->set_bit_size(1);
  b2->set_bit_offset(6);

  auto int_type = fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeSigned, 4, "int");
  auto i = fxl::MakeRefCounted<DataMember>("i", int_type, 1);

  // Note that the data member offset here is 0 which is weird, but the bit position works out
  // so it follows the integer.
  auto long_long_type = fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeSigned, 8, "long long");
  auto j = fxl::MakeRefCounted<DataMember>("j", long_long_type, 0);
  j->set_byte_size(8);
  j->set_bit_size(3);
  j->set_bit_offset(21);

  auto unsigned_type = fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeUnsigned, 4, "unsigned");
  auto k = fxl::MakeRefCounted<DataMember>("k", unsigned_type, 4);
  k->set_byte_size(4);
  k->set_bit_size(17);
  k->set_bit_offset(4);

  auto test_class_type = fxl::MakeRefCounted<Collection>(DwarfTag::kStructureType, "MyStruct");
  test_class_type->set_byte_size(8);
  test_class_type->set_data_members(std::vector<LazySymbol>({b1, b2, i, j, k}));

  constexpr uint64_t kAddress = 0x102030;
  ExprValue all_zero(test_class_type, {0, 0, 0, 0, 0, 0, 0, 0}, ExprValueSource(kAddress));

  // Validate each one for the zero case. Note that the size we get out should be the size of
  // the variable it was declared with (not the bitfield size).
  auto out =
      ResolveBitfieldMember(eval_context, all_zero, FoundMember(test_class_type.get(), b1.get()));
  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(false), out.value());
  EXPECT_EQ(ExprValueSource(kAddress, 1, 0), out.value().source());

  out = ResolveBitfieldMember(eval_context, all_zero, FoundMember(test_class_type.get(), b2.get()));
  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(false), out.value());
  EXPECT_EQ(ExprValueSource(kAddress, 1, 1), out.value().source());

  out = ResolveBitfieldMember(eval_context, all_zero, FoundMember(test_class_type.get(), j.get()));
  ASSERT_FALSE(out.has_error()) << out.err().msg();
  EXPECT_EQ(ExprValue(static_cast<int64_t>(0)), out.value());
  EXPECT_EQ(ExprValueSource(kAddress, 3, 40), out.value().source());

  out = ResolveBitfieldMember(eval_context, all_zero, FoundMember(test_class_type.get(), k.get()));
  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(static_cast<uint32_t>(0)), out.value());
  EXPECT_EQ(ExprValueSource(kAddress + 4, 17, 11), out.value().source());

  // Set bits to one one-at-a-time to make sure we find the right thing.
  out = ResolveBitfieldMember(eval_context, ExprValue(test_class_type, {1, 0, 0, 0, 0, 0, 0, 0}),
                              FoundMember(test_class_type.get(), b1.get()));
  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(true), out.value());

  out = ResolveBitfieldMember(eval_context, ExprValue(test_class_type, {2, 0, 0, 0, 0, 0, 0, 0}),
                              FoundMember(test_class_type.get(), b2.get()));
  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(true), out.value());

  // This one gets sign-extended because all bits are set.
  out = ResolveBitfieldMember(eval_context, ExprValue(test_class_type, {0, 0, 0, 0, 0, 7, 0, 0}),
                              FoundMember(test_class_type.get(), j.get()));
  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(static_cast<int64_t>(-1)), out.value());

  ExprValue saturated_k(test_class_type, {0, 0, 0, 0, 0, 0xf8, 0xff, 0x0f});
  out =
      ResolveBitfieldMember(eval_context, saturated_k, FoundMember(test_class_type.get(), k.get()));
  ASSERT_FALSE(out.has_error());
  constexpr uint32_t kSaturatedK = 0x1ffff;
  EXPECT_EQ(ExprValue(kSaturatedK), out.value());

  // Test that resolving bitfields by pointer is hooked up.
  auto test_class_ptr_type =
      fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, test_class_type);
  eval_context->data_provider()->AddMemory(kAddress, saturated_k.data());
  ExprValue ptr_value(kAddress, test_class_ptr_type);

  bool called = false;
  ResolveMemberByPointer(eval_context, ptr_value, FoundMember(test_class_type.get(), k.get()),
                         [&called, &out](ErrOrValue value) {
                           called = true;
                           out = std::move(value);
                         });

  // Requesting the memory for the pointer is async.
  EXPECT_FALSE(called);
  loop().RunUntilNoTasks();
  EXPECT_TRUE(called);

  ASSERT_FALSE(out.has_error());
  EXPECT_EQ(ExprValue(kSaturatedK), out.value());
}

// Tests two cases: bitfields on a base class with an offset, and bitfields sprad across more
// bytes than the type of the bitfield.
TEST_F(Bitfield, NegativeBitOffset) {
  auto eval_context = fxl::MakeRefCounted<MockEvalContext>();

  // Defines struct members that look like this:
  //   // This just pushes the offset of Base members within the derived struct over by 4 bytes.
  //   struct SomeOtherBase {
  //     uint32_t value;
  //   }
  //
  //   #pragma pack(push, 1)
  //   struct Base {
  //     uint64_t b1 : 4;
  //     uint64_t b2 : 63;
  //   };
  //
  //   struct Derived : public SomeOtherBase, public Base {
  //   };
  //
  // The values here are from copying the DWARF that the compiler generated from this struct.

  auto uint64_t_type = fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeSigned, 8, "uint64_t");
  const char kB1Name[] = "b1";
  auto b1 = fxl::MakeRefCounted<DataMember>(kB1Name, uint64_t_type, 0);
  b1->set_byte_size(8);
  b1->set_bit_size(4);
  b1->set_bit_offset(0x3c);

  const char kB2Name[] = "b2";
  auto b2 = fxl::MakeRefCounted<DataMember>(kB2Name, uint64_t_type, 0);
  b2->set_byte_size(8);
  b2->set_bit_size(0x3f);
  b2->set_bit_offset(-3);

  auto base_type = fxl::MakeRefCounted<Collection>(DwarfTag::kStructureType, "Base");
  base_type->set_byte_size(9);
  base_type->set_data_members(std::vector<LazySymbol>({b1, b2}));

  auto derived_type = fxl::MakeRefCounted<Collection>(DwarfTag::kStructureType, "Derived");
  constexpr uint64_t kBaseInDerived = 4u;  // Offset of Base in Derived.
  auto inherited = fxl::MakeRefCounted<InheritedFrom>(base_type, kBaseInDerived);
  derived_type->set_inherited_from(std::vector<LazySymbol>{inherited});
  derived_type->set_byte_size(kBaseInDerived + base_type->byte_size());

  constexpr uint64_t kAddress = 0x102030;
  ExprValue all_zero(derived_type, std::vector<uint8_t>(derived_type->byte_size()),
                     ExprValueSource(kAddress));

  // Read 0 from both members. This uses ResolveNonstaticMember which forces it to do the name
  // lookup and compute the offsets of the base member within the derived class.
  ErrOrValue out = ResolveNonstaticMember(eval_context, all_zero, ParsedIdentifier(kB1Name));
  ASSERT_TRUE(out.ok());
  EXPECT_EQ(ExprValue(static_cast<uint64_t>(0)), out.value());
  out = ResolveNonstaticMember(eval_context, all_zero, ParsedIdentifier(kB2Name));
  ASSERT_TRUE(out.ok());
  EXPECT_EQ(ExprValue(static_cast<uint64_t>(0)), out.value());

  // b1 = 3;
  // b2 = 123456;                 [padding-]
  ExprValue values(derived_type, {0, 0, 0, 0, 0x03, 0x24, 0x1e, 0, 0, 0, 0, 0, 0},
                   ExprValueSource(kAddress));
  out = ResolveNonstaticMember(eval_context, values, ParsedIdentifier(kB1Name));
  ASSERT_TRUE(out.ok());
  EXPECT_EQ(ExprValue(static_cast<uint64_t>(3)), out.value());
  out = ResolveNonstaticMember(eval_context, values, ParsedIdentifier(kB2Name));
  ASSERT_TRUE(out.ok());
  EXPECT_EQ(ExprValue(static_cast<uint64_t>(123456)), out.value());
}

// This goes through the general EvalBinaryOperator path to make sure the bitfield code is hooked up
// properly.
TEST_F(Bitfield, Assignment) {
  auto eval_context = fxl::MakeRefCounted<MockEvalContext>();

  auto int32_type = MakeInt32Type();

  constexpr uint64_t kAddress = 0x98723461923;
  constexpr uint32_t kBitSize = 3;
  constexpr uint32_t kBitShift = 2;
  ExprValue dest(int32_type, {0, 0, 0, 0}, ExprValueSource(kAddress, kBitSize, kBitShift));

  constexpr uint8_t kValue = 0b111;
  ExprValue all_ones(int32_type, {kValue, 0, 0, 0});

  // We haven't set the backing memory yet so the read will fail and the write will be skipped.
  ErrOrValue out = SyncEvalBinaryOperator(eval_context, dest, ExprTokenType::kEquals, all_ones);
  EXPECT_TRUE(out.has_error());
  auto mem_writes = eval_context->data_provider()->GetMemoryWrites();
  ASSERT_EQ(0u, mem_writes.size());

  // Provide all 0's backing memory and do the write again. This should succeed.
  eval_context->data_provider()->AddMemory(kAddress, {0, 0, 0, 0});
  out = SyncEvalBinaryOperator(eval_context, dest, ExprTokenType::kEquals, all_ones);
  ASSERT_FALSE(out.has_error());

  // Validate the 1's were written.
  mem_writes = eval_context->data_provider()->GetMemoryWrites();
  ASSERT_EQ(1u, mem_writes.size());
  EXPECT_EQ(kAddress, mem_writes[0].first);
  EXPECT_EQ(std::vector<uint8_t>({0b00011100}), mem_writes[0].second);

  // Now set the backing data to all 1's and write 0's.
  eval_context->data_provider()->AddMemory(kAddress, {0xff, 0xff, 0xff, 0xff});
  ExprValue all_zeroes(int32_type, {0, 0, 0, 0});
  out = SyncEvalBinaryOperator(eval_context, dest, ExprTokenType::kEquals, all_zeroes);
  ASSERT_FALSE(out.has_error());

  mem_writes = eval_context->data_provider()->GetMemoryWrites();
  ASSERT_EQ(1u, mem_writes.size());
  EXPECT_EQ(kAddress, mem_writes[0].first);
  EXPECT_EQ(std::vector<uint8_t>({0b11100011}), mem_writes[0].second);
}

}  // namespace zxdb
