]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/lib/DebugInfo/DWARFFormValue.h
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / lib / DebugInfo / DWARFFormValue.h
1 //===-- DWARFFormValue.h ----------------------------------------*- 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 #ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H
11 #define LLVM_DEBUGINFO_DWARFFORMVALUE_H
12
13 #include "llvm/Support/DataExtractor.h"
14
15 namespace llvm {
16
17 class DWARFCompileUnit;
18 class raw_ostream;
19
20 class DWARFFormValue {
21 public:
22   struct ValueType {
23     ValueType() : data(NULL) {
24       uval = 0;
25     }
26
27     union {
28       uint64_t uval;
29       int64_t sval;
30       const char* cstr;
31     };
32     const uint8_t* data;
33   };
34
35   enum {
36     eValueTypeInvalid = 0,
37     eValueTypeUnsigned,
38     eValueTypeSigned,
39     eValueTypeCStr,
40     eValueTypeBlock
41   };
42
43 private:
44   uint16_t Form;   // Form for this value.
45   ValueType Value; // Contains all data for the form.
46
47 public:
48   DWARFFormValue(uint16_t form = 0) : Form(form) {}
49   uint16_t getForm() const { return Form; }
50   const ValueType& value() const { return Value; }
51   void dump(raw_ostream &OS, const DWARFCompileUnit* cu) const;
52   bool extractValue(DataExtractor data, uint32_t *offset_ptr,
53                     const DWARFCompileUnit *cu);
54   bool isInlinedCStr() const {
55     return Value.data != NULL && Value.data == (uint8_t*)Value.cstr;
56   }
57   const uint8_t *BlockData() const;
58   uint64_t getReference(const DWARFCompileUnit* cu) const;
59
60   /// Resolve any compile unit specific references so that we don't need
61   /// the compile unit at a later time in order to work with the form
62   /// value.
63   bool resolveCompileUnitReferences(const DWARFCompileUnit* cu);
64   uint64_t getUnsigned() const { return Value.uval; }
65   int64_t getSigned() const { return Value.sval; }
66   const char *getAsCString(const DataExtractor *debug_str_data_ptr) const;
67   bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr,
68                  const DWARFCompileUnit *cu) const;
69   static bool skipValue(uint16_t form, DataExtractor debug_info_data,
70                         uint32_t *offset_ptr, const DWARFCompileUnit *cu);
71   static bool isBlockForm(uint16_t form);
72   static bool isDataForm(uint16_t form);
73   static const uint8_t *getFixedFormSizesForAddressSize(uint8_t addr_size);
74 };
75
76 }
77
78 #endif