blob: 9b270a5739a75336dd159d5d5b789a13349aef3b [file] [log] [blame]
// Copyright 2018 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 "garnet/bin/zxdb/symbols/type_test_support.h"
#include "garnet/bin/zxdb/symbols/base_type.h"
#include "garnet/bin/zxdb/symbols/collection.h"
#include "garnet/bin/zxdb/symbols/data_member.h"
#include "garnet/bin/zxdb/symbols/inherited_from.h"
namespace zxdb {
fxl::RefPtr<BaseType> MakeInt32Type() {
return fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeSigned, 4, "int32_t");
}
fxl::RefPtr<BaseType> MakeUint32Type() {
return fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeUnsigned, 4,
"uint32_t");
}
fxl::RefPtr<BaseType> MakeInt64Type() {
return fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeSigned, 8, "int64_t");
}
fxl::RefPtr<BaseType> MakeUint64Type() {
return fxl::MakeRefCounted<BaseType>(BaseType::kBaseTypeUnsigned, 8,
"uint64_t");
}
fxl::RefPtr<Collection> MakeCollectionType(
int type_tag, const std::string& type_name,
std::initializer_list<NameAndType> members) {
return MakeCollectionTypeWithOffset(type_tag, type_name, 0,
std::move(members));
}
fxl::RefPtr<Collection> MakeCollectionTypeWithOffset(
int type_tag, const std::string& type_name, uint32_t first_member_offset,
std::initializer_list<NameAndType> members) {
auto result = fxl::MakeRefCounted<Collection>(type_tag);
result->set_assigned_name(type_name);
uint32_t offset = first_member_offset;
std::vector<LazySymbol> data_members;
for (const auto & [ name, type ] : members) {
auto member = fxl::MakeRefCounted<DataMember>();
member->set_assigned_name(name);
member->set_type(LazySymbol(type));
member->set_member_location(offset);
data_members.emplace_back(member);
offset += type->byte_size();
}
result->set_byte_size(offset);
result->set_data_members(std::move(data_members));
return result;
}
fxl::RefPtr<Collection> MakeDerivedClassPair(
int type_tag, const std::string& base_name,
std::initializer_list<NameAndType> base_members,
const std::string& derived_name,
std::initializer_list<NameAndType> derived_members) {
auto base = MakeCollectionTypeWithOffset(type_tag, base_name, 0,
std::move(base_members));
// Leave room at the beginning of |derived| for the base class.
auto derived = MakeCollectionTypeWithOffset(
type_tag, derived_name, base->byte_size(), std::move(derived_members));
derived->set_inherited_from(
{LazySymbol(fxl::MakeRefCounted<InheritedFrom>(LazySymbol(base), 0))});
return derived;
}
} // namespace zxdb