//===-- DWARFFormValue.h ----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_DEBUGINFO_DWARFFORMVALUE_H
#define LLVM_DEBUGINFO_DWARFFORMVALUE_H

#include "llvm/Support/DataExtractor.h"

namespace llvm {

class DWARFCompileUnit;
class raw_ostream;

class DWARFFormValue {
public:
  struct ValueType {
    ValueType() : data(NULL) {
      uval = 0;
    }

    union {
      uint64_t uval;
      int64_t sval;
      const char* cstr;
    };
    const uint8_t* data;
  };

  enum {
    eValueTypeInvalid = 0,
    eValueTypeUnsigned,
    eValueTypeSigned,
    eValueTypeCStr,
    eValueTypeBlock
  };

private:
  uint16_t Form;   // Form for this value.
  ValueType Value; // Contains all data for the form.

public:
  DWARFFormValue(uint16_t form = 0) : Form(form) {}
  uint16_t getForm() const { return Form; }
  const ValueType& value() const { return Value; }
  void dump(raw_ostream &OS, const DWARFCompileUnit* cu) const;
  bool extractValue(DataExtractor data, uint32_t *offset_ptr,
                    const DWARFCompileUnit *cu);
  bool isInlinedCStr() const {
    return Value.data != NULL && Value.data == (const uint8_t*)Value.cstr;
  }
  const uint8_t *BlockData() const;
  uint64_t getReference(const DWARFCompileUnit* cu) const;

  /// Resolve any compile unit specific references so that we don't need
  /// the compile unit at a later time in order to work with the form
  /// value.
  bool resolveCompileUnitReferences(const DWARFCompileUnit* cu);
  uint64_t getUnsigned() const { return Value.uval; }
  int64_t getSigned() const { return Value.sval; }
  const char *getAsCString(const DataExtractor *debug_str_data_ptr) const;
  const char *getIndirectCString(const DataExtractor *,
                                 const DataExtractor *) const;
  uint64_t getIndirectAddress(const DataExtractor *,
                              const DWARFCompileUnit *) const;
  bool skipValue(DataExtractor debug_info_data, uint32_t *offset_ptr,
                 const DWARFCompileUnit *cu) const;
  static bool skipValue(uint16_t form, DataExtractor debug_info_data,
                        uint32_t *offset_ptr, const DWARFCompileUnit *cu);
  static bool isBlockForm(uint16_t form);
  static bool isDataForm(uint16_t form);
  static const uint8_t *getFixedFormSizesForAddressSize(uint8_t addr_size);
};

}

#endif
