blob: fc89454efbf5c0b884a83a3a5ee19f065cb63b72 [file] [log] [blame]
// 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/eval_test_support.h"
#include "src/developer/debug/zxdb/symbols/base_type.h"
#include "src/developer/debug/zxdb/symbols/inherited_from.h"
#include "src/developer/debug/zxdb/symbols/type_test_support.h"
namespace zxdb {
DerivedClassTestSetup::DerivedClassTestSetup() {
// Main types.
auto int16_type = MakeInt16Type();
auto int32_type = MakeInt32Type();
base1_type = MakeCollectionType(DwarfTag::kStructureType, "Base1", {{"b", int16_type}});
base2_type = MakeCollectionType(DwarfTag::kStructureType, "Base2", {{"b", int32_type}});
derived_type =
MakeCollectionTypeWithOffset(DwarfTag::kStructureType, "Derived", 6, {{"d", int32_type}});
derived_type->set_inherited_from(
{LazySymbol(fxl::MakeRefCounted<InheritedFrom>(base1_type, kBase1Offset)),
LazySymbol(fxl::MakeRefCounted<InheritedFrom>(base2_type, kBase2Offset))});
// Pointer variants.
base1_ptr_type = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, base1_type);
base2_ptr_type = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, base2_type);
derived_ptr_type = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kPointerType, derived_type);
// Reference types.
base1_ref_type = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kReferenceType, base1_type);
base2_ref_type = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kReferenceType, base2_type);
derived_ref_type = fxl::MakeRefCounted<ModifiedType>(DwarfTag::kReferenceType, derived_type);
// Values.
constexpr uint8_t kB1Value = 32;
constexpr uint8_t kB2Value = 78;
constexpr uint8_t kDValue = 12;
std::vector<uint8_t> base1_storage = {kB1Value, 0};
std::vector<uint8_t> base2_storage = {kB2Value, 0, 0, 0};
std::vector<uint8_t> derived_storage = {kB1Value, 0, // Base #1 class' int16 value.
kB2Value, 0, 0, 0, // Base class' int32 value.
kDValue, 0, 0, 0}; // Derived class' int32 value.
derived_value = ExprValue(derived_type, derived_storage, ExprValueSource(kDerivedAddr));
base1_value = ExprValue(base1_type, base1_storage, ExprValueSource(kBase1Addr));
base2_value = ExprValue(base2_type, base2_storage, ExprValueSource(kBase2Addr));
// Pointer values.
std::vector<uint8_t> derived_ptr_storage = {0, 0x30, 0, 0, 0, 0, 0, 0};
derived_ptr_value = ExprValue(derived_ptr_type, derived_ptr_storage, ExprValueSource());
std::vector<uint8_t> base1_ptr_storage = {0, 0x30, 0, 0, 0, 0, 0, 0};
base1_ptr_value = ExprValue(base1_ptr_type, base1_ptr_storage, ExprValueSource());
std::vector<uint8_t> base2_ptr_storage = {0x02, 0x30, 0, 0, 0, 0, 0, 0};
base2_ptr_value = ExprValue(base2_ptr_type, base2_ptr_storage, ExprValueSource());
// Reference values (use the same addresses as the pointer variants).
derived_ref_value = ExprValue(derived_ref_type, derived_ptr_storage, ExprValueSource());
base1_ref_value = ExprValue(base1_ref_type, base1_ptr_storage, ExprValueSource());
base2_ref_value = ExprValue(base2_ref_type, base2_ptr_storage, ExprValueSource());
}
} // namespace zxdb