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