| // 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/expr_value_source.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| namespace zxdb { | |
| // static | |
| const char* ExprValueSource::TypeToString(Type t) { | |
| switch (t) { | |
| case Type::kTemporary: | |
| return "temporary"; | |
| case Type::kMemory: | |
| return "memory"; | |
| case Type::kRegister: | |
| return "register"; | |
| case Type::kConstant: | |
| return "constant"; | |
| case Type::kComposite: | |
| return "composite"; | |
| } | |
| return "unknown"; | |
| } | |
| uint128_t ExprValueSource::SetBits(uint128_t existing, uint128_t new_value) const { | |
| FX_DCHECK(is_bitfield()); | |
| uint128_t value = new_value << bit_shift(); | |
| // The mask to write the value at this location, taking into account both the bit size and bit | |
| // shift. The bits to write to will be set to 1. | |
| uint128_t write_mask = (static_cast<uint128_t>(1) << bit_size()) - 1; | |
| write_mask <<= bit_shift(); | |
| existing &= ~write_mask; // Zero the dest bits we'll write. | |
| return existing | (value & write_mask); | |
| } | |
| } // namespace zxdb |