| // 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. |
| |
| #pragma once |
| |
| #include <inttypes.h> |
| |
| #include <vector> |
| |
| namespace zxdb { |
| |
| class SymbolContext; |
| |
| // Describes the location of a value. A value can be in different locations |
| // depending on what the value of the IP is at which is represented as a series |
| // of ranges. The location for the value within those ranges is described as |
| // an opaque array of bytes (this is the DWARF expression which will evaluate |
| // to the value). |
| // |
| // In DWARF, simple variables that are always valid look like this: |
| // DW_AT_location (DW_OP_reg5 RDI) |
| // |
| // Complicated ones with ranges look like this: |
| // DW_AT_location: |
| // [0x00000000000ad6be, 0x00000000000ad6c8): DW_OP_reg2 RCX |
| // [0x00000000000ad6c8, 0x00000000000ad780): DW_OP_reg14 R14 |
| class VariableLocation { |
| public: |
| struct Entry { |
| // These addresses are relative to the module that generated the symbol. |
| // A symbol context is required to compare to physical addresses. |
| // |
| // These will be 0,0 for a range that's always valid. |
| uint64_t begin = 0; // First address. |
| uint64_t end = 0; // First address past end. |
| |
| // Returns whether this entry matches the given physical IP. |
| bool InRange(const SymbolContext& symbol_context, uint64_t ip) const; |
| |
| // The DWARF expression that evaluates to the result. Evaluate with the |
| // DwarfExprEval object. |
| std::vector<uint8_t> expression; |
| }; |
| |
| VariableLocation(); |
| |
| // Constructs a Location with a single location valid for all address ranges, |
| // with the program contained in the given buffer. |
| VariableLocation(const uint8_t* data, size_t size); |
| |
| // Constructs with an extracted array of Entries. |
| VariableLocation(std::vector<Entry> locations); |
| |
| ~VariableLocation(); |
| |
| // Returns whether this location lacks any actual locations. |
| bool is_null() const { return locations_.empty(); } |
| |
| const std::vector<Entry>& locations() const { return locations_; } |
| |
| // Returns the Entry that corresponds to the given IP, or nullptr if none |
| // matched. |
| const Entry* EntryForIP(const SymbolContext& symbol_context, |
| uint64_t ip) const; |
| |
| private: |
| // The location list. The DWARF spec explicitly allows for ranges to overlap |
| // which means the value can be retrieved from either location. |
| std::vector<Entry> locations_; |
| }; |
| |
| } // namespace zxdb |