1 //===-- Value.cpp ---------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "lldb/Core/Value.h"
10 
11 #include "lldb/Core/Address.h"
12 #include "lldb/Core/Module.h"
13 #include "lldb/Symbol/CompilerType.h"
14 #include "lldb/Symbol/ObjectFile.h"
15 #include "lldb/Symbol/SymbolContext.h"
16 #include "lldb/Symbol/Type.h"
17 #include "lldb/Symbol/Variable.h"
18 #include "lldb/Target/ExecutionContext.h"
19 #include "lldb/Target/Process.h"
20 #include "lldb/Target/SectionLoadList.h"
21 #include "lldb/Target/Target.h"
22 #include "lldb/Utility/ConstString.h"
23 #include "lldb/Utility/DataBufferHeap.h"
24 #include "lldb/Utility/DataExtractor.h"
25 #include "lldb/Utility/Endian.h"
26 #include "lldb/Utility/FileSpec.h"
27 #include "lldb/Utility/State.h"
28 #include "lldb/Utility/Stream.h"
29 #include "lldb/lldb-defines.h"
30 #include "lldb/lldb-forward.h"
31 #include "lldb/lldb-types.h"
32 
33 #include <memory>
34 #include <optional>
35 #include <string>
36 
37 #include <cinttypes>
38 
39 using namespace lldb;
40 using namespace lldb_private;
41 
Value()42 Value::Value() : m_value(), m_compiler_type(), m_data_buffer() {}
43 
Value(const Scalar & scalar)44 Value::Value(const Scalar &scalar)
45     : m_value(scalar), m_compiler_type(), m_data_buffer() {}
46 
Value(const void * bytes,int len)47 Value::Value(const void *bytes, int len)
48     : m_value(), m_compiler_type(), m_value_type(ValueType::HostAddress),
49       m_data_buffer() {
50   SetBytes(bytes, len);
51 }
52 
Value(const Value & v)53 Value::Value(const Value &v)
54     : m_value(v.m_value), m_compiler_type(v.m_compiler_type),
55       m_context(v.m_context), m_value_type(v.m_value_type),
56       m_context_type(v.m_context_type), m_data_buffer() {
57   const uintptr_t rhs_value =
58       (uintptr_t)v.m_value.ULongLong(LLDB_INVALID_ADDRESS);
59   if ((rhs_value != 0) &&
60       (rhs_value == (uintptr_t)v.m_data_buffer.GetBytes())) {
61     m_data_buffer.CopyData(v.m_data_buffer.GetBytes(),
62                            v.m_data_buffer.GetByteSize());
63 
64     m_value = (uintptr_t)m_data_buffer.GetBytes();
65   }
66 }
67 
operator =(const Value & rhs)68 Value &Value::operator=(const Value &rhs) {
69   if (this != &rhs) {
70     m_value = rhs.m_value;
71     m_compiler_type = rhs.m_compiler_type;
72     m_context = rhs.m_context;
73     m_value_type = rhs.m_value_type;
74     m_context_type = rhs.m_context_type;
75     const uintptr_t rhs_value =
76         (uintptr_t)rhs.m_value.ULongLong(LLDB_INVALID_ADDRESS);
77     if ((rhs_value != 0) &&
78         (rhs_value == (uintptr_t)rhs.m_data_buffer.GetBytes())) {
79       m_data_buffer.CopyData(rhs.m_data_buffer.GetBytes(),
80                              rhs.m_data_buffer.GetByteSize());
81 
82       m_value = (uintptr_t)m_data_buffer.GetBytes();
83     }
84   }
85   return *this;
86 }
87 
SetBytes(const void * bytes,int len)88 void Value::SetBytes(const void *bytes, int len) {
89   m_value_type = ValueType::HostAddress;
90   m_data_buffer.CopyData(bytes, len);
91   m_value = (uintptr_t)m_data_buffer.GetBytes();
92 }
93 
AppendBytes(const void * bytes,int len)94 void Value::AppendBytes(const void *bytes, int len) {
95   m_value_type = ValueType::HostAddress;
96   m_data_buffer.AppendData(bytes, len);
97   m_value = (uintptr_t)m_data_buffer.GetBytes();
98 }
99 
Dump(Stream * strm)100 void Value::Dump(Stream *strm) {
101   if (!strm)
102     return;
103   m_value.GetValue(*strm, true);
104   strm->Printf(", value_type = %s, context = %p, context_type = %s",
105                Value::GetValueTypeAsCString(m_value_type), m_context,
106                Value::GetContextTypeAsCString(m_context_type));
107 }
108 
GetValueType() const109 Value::ValueType Value::GetValueType() const { return m_value_type; }
110 
GetValueAddressType() const111 AddressType Value::GetValueAddressType() const {
112   switch (m_value_type) {
113   case ValueType::Invalid:
114   case ValueType::Scalar:
115     break;
116   case ValueType::LoadAddress:
117     return eAddressTypeLoad;
118   case ValueType::FileAddress:
119     return eAddressTypeFile;
120   case ValueType::HostAddress:
121     return eAddressTypeHost;
122   }
123   return eAddressTypeInvalid;
124 }
125 
GetValueTypeFromAddressType(AddressType address_type)126 Value::ValueType Value::GetValueTypeFromAddressType(AddressType address_type) {
127   switch (address_type) {
128     case eAddressTypeFile:
129       return Value::ValueType::FileAddress;
130     case eAddressTypeLoad:
131       return Value::ValueType::LoadAddress;
132     case eAddressTypeHost:
133       return Value::ValueType::HostAddress;
134     case eAddressTypeInvalid:
135       return Value::ValueType::Invalid;
136   }
137   llvm_unreachable("Unexpected address type!");
138 }
139 
GetRegisterInfo() const140 RegisterInfo *Value::GetRegisterInfo() const {
141   if (m_context_type == ContextType::RegisterInfo)
142     return static_cast<RegisterInfo *>(m_context);
143   return nullptr;
144 }
145 
GetType()146 Type *Value::GetType() {
147   if (m_context_type == ContextType::LLDBType)
148     return static_cast<Type *>(m_context);
149   return nullptr;
150 }
151 
AppendDataToHostBuffer(const Value & rhs)152 size_t Value::AppendDataToHostBuffer(const Value &rhs) {
153   if (this == &rhs)
154     return 0;
155 
156   size_t curr_size = m_data_buffer.GetByteSize();
157   Status error;
158   switch (rhs.GetValueType()) {
159   case ValueType::Invalid:
160     return 0;
161   case ValueType::Scalar: {
162     const size_t scalar_size = rhs.m_value.GetByteSize();
163     if (scalar_size > 0) {
164       const size_t new_size = curr_size + scalar_size;
165       if (ResizeData(new_size) == new_size) {
166         rhs.m_value.GetAsMemoryData(m_data_buffer.GetBytes() + curr_size,
167                                     scalar_size, endian::InlHostByteOrder(),
168                                     error);
169         return scalar_size;
170       }
171     }
172   } break;
173   case ValueType::FileAddress:
174   case ValueType::LoadAddress:
175   case ValueType::HostAddress: {
176     const uint8_t *src = rhs.GetBuffer().GetBytes();
177     const size_t src_len = rhs.GetBuffer().GetByteSize();
178     if (src && src_len > 0) {
179       const size_t new_size = curr_size + src_len;
180       if (ResizeData(new_size) == new_size) {
181         ::memcpy(m_data_buffer.GetBytes() + curr_size, src, src_len);
182         return src_len;
183       }
184     }
185   } break;
186   }
187   return 0;
188 }
189 
ResizeData(size_t len)190 size_t Value::ResizeData(size_t len) {
191   m_value_type = ValueType::HostAddress;
192   m_data_buffer.SetByteSize(len);
193   m_value = (uintptr_t)m_data_buffer.GetBytes();
194   return m_data_buffer.GetByteSize();
195 }
196 
ValueOf(ExecutionContext * exe_ctx)197 bool Value::ValueOf(ExecutionContext *exe_ctx) {
198   switch (m_context_type) {
199   case ContextType::Invalid:
200   case ContextType::RegisterInfo: // RegisterInfo *
201   case ContextType::LLDBType:     // Type *
202     break;
203 
204   case ContextType::Variable: // Variable *
205     ResolveValue(exe_ctx);
206     return true;
207   }
208   return false;
209 }
210 
GetValueByteSize(Status * error_ptr,ExecutionContext * exe_ctx)211 uint64_t Value::GetValueByteSize(Status *error_ptr, ExecutionContext *exe_ctx) {
212   switch (m_context_type) {
213   case ContextType::RegisterInfo: // RegisterInfo *
214     if (GetRegisterInfo()) {
215       if (error_ptr)
216         error_ptr->Clear();
217       return GetRegisterInfo()->byte_size;
218     }
219     break;
220 
221   case ContextType::Invalid:
222   case ContextType::LLDBType: // Type *
223   case ContextType::Variable: // Variable *
224   {
225     auto *scope = exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr;
226     if (std::optional<uint64_t> size = GetCompilerType().GetByteSize(scope)) {
227       if (error_ptr)
228         error_ptr->Clear();
229       return *size;
230     }
231     break;
232   }
233   }
234   if (error_ptr && error_ptr->Success())
235     error_ptr->SetErrorString("Unable to determine byte size.");
236   return 0;
237 }
238 
GetCompilerType()239 const CompilerType &Value::GetCompilerType() {
240   if (!m_compiler_type.IsValid()) {
241     switch (m_context_type) {
242     case ContextType::Invalid:
243       break;
244 
245     case ContextType::RegisterInfo:
246       break; // TODO: Eventually convert into a compiler type?
247 
248     case ContextType::LLDBType: {
249       Type *lldb_type = GetType();
250       if (lldb_type)
251         m_compiler_type = lldb_type->GetForwardCompilerType();
252     } break;
253 
254     case ContextType::Variable: {
255       Variable *variable = GetVariable();
256       if (variable) {
257         Type *variable_type = variable->GetType();
258         if (variable_type)
259           m_compiler_type = variable_type->GetForwardCompilerType();
260       }
261     } break;
262     }
263   }
264 
265   return m_compiler_type;
266 }
267 
SetCompilerType(const CompilerType & compiler_type)268 void Value::SetCompilerType(const CompilerType &compiler_type) {
269   m_compiler_type = compiler_type;
270 }
271 
GetValueDefaultFormat()272 lldb::Format Value::GetValueDefaultFormat() {
273   switch (m_context_type) {
274   case ContextType::RegisterInfo:
275     if (GetRegisterInfo())
276       return GetRegisterInfo()->format;
277     break;
278 
279   case ContextType::Invalid:
280   case ContextType::LLDBType:
281   case ContextType::Variable: {
282     const CompilerType &ast_type = GetCompilerType();
283     if (ast_type.IsValid())
284       return ast_type.GetFormat();
285   } break;
286   }
287 
288   // Return a good default in case we can't figure anything out
289   return eFormatHex;
290 }
291 
GetData(DataExtractor & data)292 bool Value::GetData(DataExtractor &data) {
293   switch (m_value_type) {
294   case ValueType::Invalid:
295     return false;
296   case ValueType::Scalar:
297     if (m_value.GetData(data))
298       return true;
299     break;
300 
301   case ValueType::LoadAddress:
302   case ValueType::FileAddress:
303   case ValueType::HostAddress:
304     if (m_data_buffer.GetByteSize()) {
305       data.SetData(m_data_buffer.GetBytes(), m_data_buffer.GetByteSize(),
306                    data.GetByteOrder());
307       return true;
308     }
309     break;
310   }
311 
312   return false;
313 }
314 
GetValueAsData(ExecutionContext * exe_ctx,DataExtractor & data,Module * module)315 Status Value::GetValueAsData(ExecutionContext *exe_ctx, DataExtractor &data,
316                              Module *module) {
317   data.Clear();
318 
319   Status error;
320   lldb::addr_t address = LLDB_INVALID_ADDRESS;
321   AddressType address_type = eAddressTypeFile;
322   Address file_so_addr;
323   const CompilerType &ast_type = GetCompilerType();
324   std::optional<uint64_t> type_size = ast_type.GetByteSize(
325       exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr);
326   // Nothing to be done for a zero-sized type.
327   if (type_size && *type_size == 0)
328     return error;
329 
330   switch (m_value_type) {
331   case ValueType::Invalid:
332     error.SetErrorString("invalid value");
333     break;
334   case ValueType::Scalar: {
335     data.SetByteOrder(endian::InlHostByteOrder());
336     if (ast_type.IsValid())
337       data.SetAddressByteSize(ast_type.GetPointerByteSize());
338     else
339       data.SetAddressByteSize(sizeof(void *));
340 
341     uint32_t limit_byte_size = UINT32_MAX;
342 
343     if (type_size)
344       limit_byte_size = *type_size;
345 
346     if (limit_byte_size <= m_value.GetByteSize()) {
347       if (m_value.GetData(data, limit_byte_size))
348         return error; // Success;
349     }
350 
351     error.SetErrorString("extracting data from value failed");
352     break;
353   }
354   case ValueType::LoadAddress:
355     if (exe_ctx == nullptr) {
356       error.SetErrorString("can't read load address (no execution context)");
357     } else {
358       Process *process = exe_ctx->GetProcessPtr();
359       if (process == nullptr || !process->IsAlive()) {
360         Target *target = exe_ctx->GetTargetPtr();
361         if (target) {
362           // Allow expressions to run and evaluate things when the target has
363           // memory sections loaded. This allows you to use "target modules
364           // load" to load your executable and any shared libraries, then
365           // execute commands where you can look at types in data sections.
366           const SectionLoadList &target_sections = target->GetSectionLoadList();
367           if (!target_sections.IsEmpty()) {
368             address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
369             if (target_sections.ResolveLoadAddress(address, file_so_addr)) {
370               address_type = eAddressTypeLoad;
371               data.SetByteOrder(target->GetArchitecture().GetByteOrder());
372               data.SetAddressByteSize(
373                   target->GetArchitecture().GetAddressByteSize());
374             } else
375               address = LLDB_INVALID_ADDRESS;
376           }
377         } else {
378           error.SetErrorString("can't read load address (invalid process)");
379         }
380       } else {
381         address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
382         address_type = eAddressTypeLoad;
383         data.SetByteOrder(
384             process->GetTarget().GetArchitecture().GetByteOrder());
385         data.SetAddressByteSize(
386             process->GetTarget().GetArchitecture().GetAddressByteSize());
387       }
388     }
389     break;
390 
391   case ValueType::FileAddress:
392     if (exe_ctx == nullptr) {
393       error.SetErrorString("can't read file address (no execution context)");
394     } else if (exe_ctx->GetTargetPtr() == nullptr) {
395       error.SetErrorString("can't read file address (invalid target)");
396     } else {
397       address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
398       if (address == LLDB_INVALID_ADDRESS) {
399         error.SetErrorString("invalid file address");
400       } else {
401         if (module == nullptr) {
402           // The only thing we can currently lock down to a module so that we
403           // can resolve a file address, is a variable.
404           Variable *variable = GetVariable();
405           if (variable) {
406             SymbolContext var_sc;
407             variable->CalculateSymbolContext(&var_sc);
408             module = var_sc.module_sp.get();
409           }
410         }
411 
412         if (module) {
413           bool resolved = false;
414           ObjectFile *objfile = module->GetObjectFile();
415           if (objfile) {
416             Address so_addr(address, objfile->GetSectionList());
417             addr_t load_address =
418                 so_addr.GetLoadAddress(exe_ctx->GetTargetPtr());
419             bool process_launched_and_stopped =
420                 exe_ctx->GetProcessPtr()
421                     ? StateIsStoppedState(exe_ctx->GetProcessPtr()->GetState(),
422                                           true /* must_exist */)
423                     : false;
424             // Don't use the load address if the process has exited.
425             if (load_address != LLDB_INVALID_ADDRESS &&
426                 process_launched_and_stopped) {
427               resolved = true;
428               address = load_address;
429               address_type = eAddressTypeLoad;
430               data.SetByteOrder(
431                   exe_ctx->GetTargetRef().GetArchitecture().GetByteOrder());
432               data.SetAddressByteSize(exe_ctx->GetTargetRef()
433                                           .GetArchitecture()
434                                           .GetAddressByteSize());
435             } else {
436               if (so_addr.IsSectionOffset()) {
437                 resolved = true;
438                 file_so_addr = so_addr;
439                 data.SetByteOrder(objfile->GetByteOrder());
440                 data.SetAddressByteSize(objfile->GetAddressByteSize());
441               }
442             }
443           }
444           if (!resolved) {
445             Variable *variable = GetVariable();
446 
447             if (module) {
448               if (variable)
449                 error.SetErrorStringWithFormat(
450                     "unable to resolve the module for file address 0x%" PRIx64
451                     " for variable '%s' in %s",
452                     address, variable->GetName().AsCString(""),
453                     module->GetFileSpec().GetPath().c_str());
454               else
455                 error.SetErrorStringWithFormat(
456                     "unable to resolve the module for file address 0x%" PRIx64
457                     " in %s",
458                     address, module->GetFileSpec().GetPath().c_str());
459             } else {
460               if (variable)
461                 error.SetErrorStringWithFormat(
462                     "unable to resolve the module for file address 0x%" PRIx64
463                     " for variable '%s'",
464                     address, variable->GetName().AsCString(""));
465               else
466                 error.SetErrorStringWithFormat(
467                     "unable to resolve the module for file address 0x%" PRIx64,
468                     address);
469             }
470           }
471         } else {
472           // Can't convert a file address to anything valid without more
473           // context (which Module it came from)
474           error.SetErrorString(
475               "can't read memory from file address without more context");
476         }
477       }
478     }
479     break;
480 
481   case ValueType::HostAddress:
482     address = m_value.ULongLong(LLDB_INVALID_ADDRESS);
483     address_type = eAddressTypeHost;
484     if (exe_ctx) {
485       Target *target = exe_ctx->GetTargetPtr();
486       if (target) {
487         data.SetByteOrder(target->GetArchitecture().GetByteOrder());
488         data.SetAddressByteSize(target->GetArchitecture().GetAddressByteSize());
489         break;
490       }
491     }
492     // fallback to host settings
493     data.SetByteOrder(endian::InlHostByteOrder());
494     data.SetAddressByteSize(sizeof(void *));
495     break;
496   }
497 
498   // Bail if we encountered any errors
499   if (error.Fail())
500     return error;
501 
502   if (address == LLDB_INVALID_ADDRESS) {
503     error.SetErrorStringWithFormat("invalid %s address",
504                                    address_type == eAddressTypeHost ? "host"
505                                                                     : "load");
506     return error;
507   }
508 
509   // If we got here, we need to read the value from memory.
510   size_t byte_size = GetValueByteSize(&error, exe_ctx);
511 
512   // Bail if we encountered any errors getting the byte size.
513   if (error.Fail())
514     return error;
515 
516   // No memory to read for zero-sized types.
517   if (byte_size == 0)
518     return error;
519 
520   // Make sure we have enough room within "data", and if we don't make
521   // something large enough that does
522   if (!data.ValidOffsetForDataOfSize(0, byte_size)) {
523     auto data_sp = std::make_shared<DataBufferHeap>(byte_size, '\0');
524     data.SetData(data_sp);
525   }
526 
527   uint8_t *dst = const_cast<uint8_t *>(data.PeekData(0, byte_size));
528   if (dst != nullptr) {
529     if (address_type == eAddressTypeHost) {
530       // The address is an address in this process, so just copy it.
531       if (address == 0) {
532         error.SetErrorString("trying to read from host address of 0.");
533         return error;
534       }
535       memcpy(dst, reinterpret_cast<uint8_t *>(address), byte_size);
536     } else if ((address_type == eAddressTypeLoad) ||
537                (address_type == eAddressTypeFile)) {
538       if (file_so_addr.IsValid()) {
539         const bool force_live_memory = true;
540         if (exe_ctx->GetTargetRef().ReadMemory(file_so_addr, dst, byte_size,
541                                                error, force_live_memory) !=
542             byte_size) {
543           error.SetErrorStringWithFormat(
544               "read memory from 0x%" PRIx64 " failed", (uint64_t)address);
545         }
546       } else {
547         // The execution context might have a NULL process, but it might have a
548         // valid process in the exe_ctx->target, so use the
549         // ExecutionContext::GetProcess accessor to ensure we get the process
550         // if there is one.
551         Process *process = exe_ctx->GetProcessPtr();
552 
553         if (process) {
554           const size_t bytes_read =
555               process->ReadMemory(address, dst, byte_size, error);
556           if (bytes_read != byte_size)
557             error.SetErrorStringWithFormat(
558                 "read memory from 0x%" PRIx64 " failed (%u of %u bytes read)",
559                 (uint64_t)address, (uint32_t)bytes_read, (uint32_t)byte_size);
560         } else {
561           error.SetErrorStringWithFormat("read memory from 0x%" PRIx64
562                                          " failed (invalid process)",
563                                          (uint64_t)address);
564         }
565       }
566     } else {
567       error.SetErrorStringWithFormat("unsupported AddressType value (%i)",
568                                      address_type);
569     }
570   } else {
571     error.SetErrorString("out of memory");
572   }
573 
574   return error;
575 }
576 
ResolveValue(ExecutionContext * exe_ctx,Module * module)577 Scalar &Value::ResolveValue(ExecutionContext *exe_ctx, Module *module) {
578   const CompilerType &compiler_type = GetCompilerType();
579   if (compiler_type.IsValid()) {
580     switch (m_value_type) {
581     case ValueType::Invalid:
582     case ValueType::Scalar: // raw scalar value
583       break;
584 
585     case ValueType::FileAddress:
586     case ValueType::LoadAddress: // load address value
587     case ValueType::HostAddress: // host address value (for memory in the process
588                                 // that is using liblldb)
589     {
590       DataExtractor data;
591       lldb::addr_t addr = m_value.ULongLong(LLDB_INVALID_ADDRESS);
592       Status error(GetValueAsData(exe_ctx, data, module));
593       if (error.Success()) {
594         Scalar scalar;
595         if (compiler_type.GetValueAsScalar(
596                 data, 0, data.GetByteSize(), scalar,
597                 exe_ctx ? exe_ctx->GetBestExecutionContextScope() : nullptr)) {
598           m_value = scalar;
599           m_value_type = ValueType::Scalar;
600         } else {
601           if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes()) {
602             m_value.Clear();
603             m_value_type = ValueType::Scalar;
604           }
605         }
606       } else {
607         if ((uintptr_t)addr != (uintptr_t)m_data_buffer.GetBytes()) {
608           m_value.Clear();
609           m_value_type = ValueType::Scalar;
610         }
611       }
612     } break;
613     }
614   }
615   return m_value;
616 }
617 
GetVariable()618 Variable *Value::GetVariable() {
619   if (m_context_type == ContextType::Variable)
620     return static_cast<Variable *>(m_context);
621   return nullptr;
622 }
623 
Clear()624 void Value::Clear() {
625   m_value.Clear();
626   m_compiler_type.Clear();
627   m_value_type = ValueType::Scalar;
628   m_context = nullptr;
629   m_context_type = ContextType::Invalid;
630   m_data_buffer.Clear();
631 }
632 
GetValueTypeAsCString(ValueType value_type)633 const char *Value::GetValueTypeAsCString(ValueType value_type) {
634   switch (value_type) {
635   case ValueType::Invalid:
636     return "invalid";
637   case ValueType::Scalar:
638     return "scalar";
639   case ValueType::FileAddress:
640     return "file address";
641   case ValueType::LoadAddress:
642     return "load address";
643   case ValueType::HostAddress:
644     return "host address";
645   };
646   llvm_unreachable("enum cases exhausted.");
647 }
648 
GetContextTypeAsCString(ContextType context_type)649 const char *Value::GetContextTypeAsCString(ContextType context_type) {
650   switch (context_type) {
651   case ContextType::Invalid:
652     return "invalid";
653   case ContextType::RegisterInfo:
654     return "RegisterInfo *";
655   case ContextType::LLDBType:
656     return "Type *";
657   case ContextType::Variable:
658     return "Variable *";
659   };
660   llvm_unreachable("enum cases exhausted.");
661 }
662 
ConvertToLoadAddress(Module * module,Target * target)663 void Value::ConvertToLoadAddress(Module *module, Target *target) {
664   if (!module || !target || (GetValueType() != ValueType::FileAddress))
665     return;
666 
667   lldb::addr_t file_addr = GetScalar().ULongLong(LLDB_INVALID_ADDRESS);
668   if (file_addr == LLDB_INVALID_ADDRESS)
669     return;
670 
671   Address so_addr;
672   if (!module->ResolveFileAddress(file_addr, so_addr))
673     return;
674   lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
675   if (load_addr == LLDB_INVALID_ADDRESS)
676     return;
677 
678   SetValueType(Value::ValueType::LoadAddress);
679   GetScalar() = load_addr;
680 }
681 
PushValue(const Value & value)682 void ValueList::PushValue(const Value &value) { m_values.push_back(value); }
683 
GetSize()684 size_t ValueList::GetSize() { return m_values.size(); }
685 
GetValueAtIndex(size_t idx)686 Value *ValueList::GetValueAtIndex(size_t idx) {
687   if (idx < GetSize()) {
688     return &(m_values[idx]);
689   } else
690     return nullptr;
691 }
692 
Clear()693 void ValueList::Clear() { m_values.clear(); }
694