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