1251607Sdim//===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===//
2251607Sdim//
3251607Sdim//                     The LLVM Compiler Infrastructure
4251607Sdim//
5251607Sdim// This file is distributed under the University of Illinois Open Source
6251607Sdim// License. See LICENSE.TXT for details.
7251607Sdim//
8251607Sdim//===----------------------------------------------------------------------===//
9251607Sdim
10251607Sdim#ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H
11251607Sdim#define LLVM_DEBUGINFO_DWARFFORMVALUE_H
12251607Sdim
13263508Sdim#include "llvm/ADT/ArrayRef.h"
14263508Sdim#include "llvm/ADT/Optional.h"
15251607Sdim#include "llvm/Support/DataExtractor.h"
16251607Sdim
17251607Sdimnamespace llvm {
18251607Sdim
19263508Sdimclass DWARFUnit;
20251607Sdimclass raw_ostream;
21251607Sdim
22251607Sdimclass DWARFFormValue {
23251607Sdimpublic:
24263508Sdim  enum FormClass {
25263508Sdim    FC_Unknown,
26263508Sdim    FC_Address,
27263508Sdim    FC_Block,
28263508Sdim    FC_Constant,
29263508Sdim    FC_String,
30263508Sdim    FC_Flag,
31263508Sdim    FC_Reference,
32263508Sdim    FC_Indirect,
33263508Sdim    FC_SectionOffset,
34263508Sdim    FC_Exprloc
35263508Sdim  };
36263508Sdim
37263508Sdimprivate:
38251607Sdim  struct ValueType {
39251607Sdim    ValueType() : data(NULL) {
40251607Sdim      uval = 0;
41251607Sdim    }
42251607Sdim
43251607Sdim    union {
44251607Sdim      uint64_t uval;
45251607Sdim      int64_t sval;
46251607Sdim      const char* cstr;
47251607Sdim    };
48251607Sdim    const uint8_t* data;
49251607Sdim  };
50251607Sdim
51251607Sdim  uint16_t Form;   // Form for this value.
52251607Sdim  ValueType Value; // Contains all data for the form.
53251607Sdim
54251607Sdimpublic:
55263508Sdim  DWARFFormValue(uint16_t Form = 0) : Form(Form) {}
56251607Sdim  uint16_t getForm() const { return Form; }
57263508Sdim  bool isFormClass(FormClass FC) const;
58263508Sdim
59263508Sdim  void dump(raw_ostream &OS, const DWARFUnit *U) const;
60251607Sdim  bool extractValue(DataExtractor data, uint32_t *offset_ptr,
61263508Sdim                    const DWARFUnit *u);
62251607Sdim  bool isInlinedCStr() const {
63251607Sdim    return Value.data != NULL && Value.data == (const uint8_t*)Value.cstr;
64251607Sdim  }
65251607Sdim
66263508Sdim  /// getAsFoo functions below return the extracted value as Foo if only
67263508Sdim  /// DWARFFormValue has form class is suitable for representing Foo.
68263508Sdim  Optional<uint64_t> getAsReference(const DWARFUnit *U) const;
69263508Sdim  Optional<uint64_t> getAsUnsignedConstant() const;
70263508Sdim  Optional<const char *> getAsCString(const DWARFUnit *U) const;
71263508Sdim  Optional<uint64_t> getAsAddress(const DWARFUnit *U) const;
72263508Sdim  Optional<uint64_t> getAsSectionOffset() const;
73263508Sdim
74251607Sdim  bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr,
75263508Sdim                 const DWARFUnit *u) const;
76251607Sdim  static bool skipValue(uint16_t form, DataExtractor debug_info_data,
77263508Sdim                        uint32_t *offset_ptr, const DWARFUnit *u);
78263508Sdim
79263508Sdim  static ArrayRef<uint8_t> getFixedFormSizes(uint8_t AddrSize,
80263508Sdim                                             uint16_t Version);
81251607Sdim};
82251607Sdim
83251607Sdim}
84251607Sdim
85251607Sdim#endif
86