DWARFFormValue.h revision 72c0d7fdd3d0930c7507060e96aec7d7429a8190
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
1372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#include "llvm/Support/DataExtractor.h"
1472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
1572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramernamespace llvm {
1672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
1772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFCompileUnit;
1872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass raw_ostream;
1972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
2072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerclass DWARFFormValue {
2172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic:
2272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  struct ValueType {
2372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    ValueType() : data(NULL) {
2472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      uval = 0;
2572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    }
2672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
2772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    union {
2872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      uint64_t uval;
2972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      int64_t sval;
3072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      const char* cstr;
3172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    };
3272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    const uint8_t* data;
3372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  };
3472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
3572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  enum {
3672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    eValueTypeInvalid = 0,
3772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    eValueTypeUnsigned,
3872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    eValueTypeSigned,
3972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    eValueTypeCStr,
4072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    eValueTypeBlock
4172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  };
4272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
4372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerprivate:
4472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  uint16_t Form;   // Form for this value.
4572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  ValueType Value; // Contains all data for the form.
4672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
4772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramerpublic:
4872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  DWARFFormValue(uint16_t form = 0) : Form(form) {}
4972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  uint16_t getForm() const { return Form; }
5072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  const ValueType& value() const { return Value; }
5172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  void dump(raw_ostream &OS, const DataExtractor *debug_str_data,
5272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer            const DWARFCompileUnit* cu) const;
5372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool extractValue(DataExtractor data, uint32_t *offset_ptr,
5472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer      const DWARFCompileUnit *cu);
5572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool isInlinedCStr() const {
5672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer    return Value.data != NULL && Value.data == (uint8_t*)Value.cstr;
5772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  }
5872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  const uint8_t *BlockData() const;
5972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  uint64_t getReference(const DWARFCompileUnit* cu) const;
6072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
6172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  /// Resolve any compile unit specific references so that we don't need
6272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  /// the compile unit at a later time in order to work with the form
6372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  /// value.
6472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool resolveCompileUnitReferences(const DWARFCompileUnit* cu);
6572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  uint64_t getUnsigned() const { return Value.uval; }
6672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  int64_t getSigned() const { return Value.sval; }
6772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  const char *getAsCString(const DataExtractor *debug_str_data_ptr) const;
6872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr,
6972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer                 const DWARFCompileUnit *cu) const;
7072c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  static bool skipValue(uint16_t form, DataExtractor debug_info_data,
7172c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer                        uint32_t *offset_ptr, const DWARFCompileUnit *cu);
7272c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  static bool isBlockForm(uint16_t form);
7372c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  static bool isDataForm(uint16_t form);
7472c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer  static const uint8_t *getFixedFormSizesForAddressSize(uint8_t addr_size);
7572c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer};
7672c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
7772c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer}
7872c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer
7972c0d7fdd3d0930c7507060e96aec7d7429a8190Benjamin Kramer#endif
80