//==-- llvm/MC/MCRelocationInfo.h --------------------------------*- C++ -*-==//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the MCRelocationInfo class, which provides methods to
// create MCExprs from relocations, either found in an object::ObjectFile
// (object::RelocationRef), or provided through the C API.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_MC_MCRELOCATIONINFO_H
#define LLVM_MC_MCRELOCATIONINFO_H

#include "llvm/Support/Compiler.h"

namespace llvm {

namespace object {
class RelocationRef;
}
class MCExpr;
class MCContext;

/// \brief Create MCExprs from relocations found in an object file.
class MCRelocationInfo {
  MCRelocationInfo(const MCRelocationInfo &) LLVM_DELETED_FUNCTION;
  void operator=(const MCRelocationInfo &) LLVM_DELETED_FUNCTION;

protected:
  MCContext &Ctx;

public:
  MCRelocationInfo(MCContext &Ctx);
  virtual ~MCRelocationInfo();

  /// \brief Create an MCExpr for the relocation \p Rel.
  /// \returns If possible, an MCExpr corresponding to Rel, else 0.
  virtual const MCExpr *createExprForRelocation(object::RelocationRef Rel);

  /// \brief Create an MCExpr for the target-specific \p VariantKind.
  /// The VariantKinds are defined in llvm-c/Disassembler.h.
  /// Used by MCExternalSymbolizer.
  /// \returns If possible, an MCExpr corresponding to VariantKind, else 0.
  virtual const MCExpr *createExprForCAPIVariantKind(const MCExpr *SubExpr,
                                                     unsigned VariantKind);
};

}

#endif
