172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===//
272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//
372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//                     The LLVM Compiler Infrastructure
472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//
572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// This file is distributed under the University of Illinois Open Source
672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer// License. See LICENSE.TXT for details.
772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//
872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer//===----------------------------------------------------------------------===//
972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
1072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H
1172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#define LLVM_DEBUGINFO_DWARFFORMVALUE_H
1272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
136faff4886a3059a8cda08f015d29a6c9a0a4de3cAlexey Samsonov#include "llvm/ADT/ArrayRef.h"
14c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov#include "llvm/ADT/Optional.h"
1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/DataExtractor.h"
1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramernamespace llvm {
1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
19cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikieclass DWARFUnit;
2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass raw_ostream;
2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFFormValue {
23c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonovpublic:
24c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  enum FormClass {
25c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Unknown,
26c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Address,
27c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Block,
28c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Constant,
29c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_String,
30c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Flag,
31c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Reference,
32c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Indirect,
33c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_SectionOffset,
34c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov    FC_Exprloc
35c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  };
36c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov
37c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonovprivate:
3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  struct ValueType {
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    ValueType() : data(nullptr) {
4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      uval = 0;
4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    }
4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    union {
4472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      uint64_t uval;
4572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      int64_t sval;
4672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      const char* cstr;
4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    };
4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    const uint8_t* data;
4972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  };
5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  uint16_t Form;   // Form for this value.
5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  ValueType Value; // Contains all data for the form.
5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic:
55c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  DWARFFormValue(uint16_t Form = 0) : Form(Form) {}
5672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  uint16_t getForm() const { return Form; }
57c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  bool isFormClass(FormClass FC) const;
58c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov
59cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie  void dump(raw_ostream &OS, const DWARFUnit *U) const;
6072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool extractValue(DataExtractor data, uint32_t *offset_ptr,
61cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                    const DWARFUnit *u);
6272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool isInlinedCStr() const {
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return Value.data != nullptr && Value.data == (const uint8_t*)Value.cstr;
6472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  }
6572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
66c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  /// getAsFoo functions below return the extracted value as Foo if only
67c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  /// DWARFFormValue has form class is suitable for representing Foo.
68c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  Optional<uint64_t> getAsReference(const DWARFUnit *U) const;
69c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  Optional<uint64_t> getAsUnsignedConstant() const;
70c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  Optional<const char *> getAsCString(const DWARFUnit *U) const;
71c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  Optional<uint64_t> getAsAddress(const DWARFUnit *U) const;
72c5253237f8b3b4eb888f7f85f39acd7d4d0f57cfAlexey Samsonov  Optional<uint64_t> getAsSectionOffset() const;
7371f6d6ee1a42a39b897f165802716baaad91e21bAlexey Samsonov
7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr,
75cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                 const DWARFUnit *u) const;
7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  static bool skipValue(uint16_t form, DataExtractor debug_info_data,
77cd7c4980d4ee2d22d92a4907f2d029e67b52d732David Blaikie                        uint32_t *offset_ptr, const DWARFUnit *u);
7871f6d6ee1a42a39b897f165802716baaad91e21bAlexey Samsonov
796faff4886a3059a8cda08f015d29a6c9a0a4de3cAlexey Samsonov  static ArrayRef<uint8_t> getFixedFormSizes(uint8_t AddrSize,
806faff4886a3059a8cda08f015d29a6c9a0a4de3cAlexey Samsonov                                             uint16_t Version);
8172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer};
8272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
8372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}
8472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
8572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#endif
86