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