1a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner//===-- llvm/MC/MCValue.h - MCValue class -----------------------*- C++ -*-===//
235d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//
335d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//                     The LLVM Compiler Infrastructure
435d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//
535d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner// This file is distributed under the University of Illinois Open Source
635d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner// License. See LICENSE.TXT for details.
735d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//
835d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//===----------------------------------------------------------------------===//
935d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//
10a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner// This file contains the declaration of the MCValue class.
1135d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//
1235d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner//===----------------------------------------------------------------------===//
1335d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner
14a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner#ifndef LLVM_MC_MCVALUE_H
15a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner#define LLVM_MC_MCVALUE_H
1635d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCExpr.h"
1815d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar#include "llvm/MC/MCSymbol.h"
19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Support/DataTypes.h"
2015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar#include <cassert>
21dcee6847555373c6f352370042486ef904a3d55bBill Wendling
2235d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattnernamespace llvm {
2310b318bcb39218d2ed525e4862c854bc8d1baf63Chris Lattnerclass MCAsmInfo;
242c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbarclass raw_ostream;
2535d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// MCValue - This represents an "assembler immediate".  In its most
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// general form, this can hold ":Kind:(SymbolA - SymbolB + imm64)".
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Not all targets supports relocations of this general form, but we
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// need to represent this anyway.
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines///
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// In general both SymbolA and SymbolB will also have a modifier
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// analogous to the top-level Kind. Current targets are not expected
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// to make use of both though. The choice comes down to whether
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// relocation modifiers apply to the closest symbol or the whole
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// expression.
36a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner///
3715d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar/// In the general form, SymbolB can only be defined if SymbolA is, and both
38374d8bddacbffce7c82ce81103d30b5ee42032dfDaniel Dunbar/// must be in the same (non-external) section. The latter constraint is not
39374d8bddacbffce7c82ce81103d30b5ee42032dfDaniel Dunbar/// enforced, since a symbol's section may not be known at construction.
4015d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar///
41a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner/// Note that this class must remain a simple POD value class, because we need
42a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner/// it to live in unions etc.
43a33ccc795659919b2c0d8575a704821eb1972149Chris Lattnerclass MCValue {
449a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  const MCSymbolRefExpr *SymA, *SymB;
4535d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner  int64_t Cst;
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint32_t RefKind;
4735d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattnerpublic:
4835d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner
497908a6a189d12c38269df2891a24382525d00591Daniel Dunbar  int64_t getConstant() const { return Cst; }
509a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  const MCSymbolRefExpr *getSymA() const { return SymA; }
519a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  const MCSymbolRefExpr *getSymB() const { return SymB; }
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint32_t getRefKind() const { return RefKind; }
537908a6a189d12c38269df2891a24382525d00591Daniel Dunbar
5480f62d0062a6008403eb889c35fa19939c5c50cfDaniel Dunbar  /// isAbsolute - Is this an absolute (as opposed to relocatable) value.
5580f62d0062a6008403eb889c35fa19939c5c50cfDaniel Dunbar  bool isAbsolute() const { return !SymA && !SymB; }
5615d170709608e2f1efcada74c297c10c8c71fdcfDaniel Dunbar
57c5252da873d547a19069eaf9030fec203f128f66Dmitri Gribenko  /// print - Print the value to the stream \p OS.
58684c593d05db0bd277268fc9d8c05bce138c745aChris Lattner  void print(raw_ostream &OS, const MCAsmInfo *MAI) const;
599a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar
602c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar  /// dump - Print the value to stderr.
612c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar  void dump() const;
622c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbolRefExpr::VariantKind getAccessVariant() const;
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  static MCValue get(const MCSymbolRefExpr *SymA,
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     const MCSymbolRefExpr *SymB = nullptr,
6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                     int64_t Val = 0, uint32_t RefKind = 0) {
68a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner    MCValue R;
69374d8bddacbffce7c82ce81103d30b5ee42032dfDaniel Dunbar    assert((!SymB || SymA) && "Invalid relocatable MCValue!");
7035d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner    R.Cst = Val;
7135d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner    R.SymA = SymA;
7235d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner    R.SymB = SymB;
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    R.RefKind = RefKind;
7435d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner    return R;
7535d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner  }
769a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar
77a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner  static MCValue get(int64_t Val) {
78a33ccc795659919b2c0d8575a704821eb1972149Chris Lattner    MCValue R;
7935d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner    R.Cst = Val;
80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    R.SymA = nullptr;
81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    R.SymB = nullptr;
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    R.RefKind = 0;
8335d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner    return R;
8435d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner  }
859a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar
8635d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner};
8735d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner
8835d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner} // end namespace llvm
8935d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner
9035d0e8793737201d9e24f8944f0ead5636a695f4Chris Lattner#endif
91