12c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar//===- lib/MC/MCValue.cpp - MCValue implementation ------------------------===//
22c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar//
32c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar//                     The LLVM Compiler Infrastructure
42c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar//
52c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar// This file is distributed under the University of Illinois Open Source
62c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar// License. See LICENSE.TXT for details.
72c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar//
82c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar//===----------------------------------------------------------------------===//
92c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar
102c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar#include "llvm/MC/MCValue.h"
119a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar#include "llvm/MC/MCExpr.h"
1224c802bc8d6b3e248b4bc4e5951c88127dd799d6David Greene#include "llvm/Support/Debug.h"
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/ErrorHandling.h"
142c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar#include "llvm/Support/raw_ostream.h"
152c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar
162c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbarusing namespace llvm;
172c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar
18684c593d05db0bd277268fc9d8c05bce138c745aChris Lattnervoid MCValue::print(raw_ostream &OS, const MCAsmInfo *MAI) const {
192c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar  if (isAbsolute()) {
202c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar    OS << getConstant();
212c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar    return;
222c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar  }
232c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // FIXME: prints as a number, which isn't ideal. But the meaning will be
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // target-specific anyway.
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  if (getRefKind())
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OS << ':' << getRefKind() <<  ':';
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
299a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  getSymA()->print(OS);
301689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar
319a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  if (getSymB()) {
329a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar    OS << " - ";
339a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar    getSymB()->print(OS);
349a1d20042f6a6ec648a3588f9b13264a4570aab0Daniel Dunbar  }
351689e0cf55205042b830fdbe3fc5f7b483997334Daniel Dunbar
362c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar  if (getConstant())
372c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar    OS << " + " << getConstant();
382c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar}
392c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar
40286c4dc355b8be6806081b23c3097485821c7642Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
412c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbarvoid MCValue::dump() const {
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  print(dbgs(), nullptr);
432c11624b65a65fe487f335603dc0bf6372a50a89Daniel Dunbar}
44cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#endif
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCSymbolRefExpr::VariantKind MCValue::getAccessVariant() const {
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *B = getSymB();
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (B) {
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    if (B->getKind() != MCSymbolRefExpr::VK_None)
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      llvm_unreachable("unsupported");
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  const MCSymbolRefExpr *A = getSymA();
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!A)
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return MCSymbolRefExpr::VK_None;
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  MCSymbolRefExpr::VariantKind Kind = A->getKind();
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Kind == MCSymbolRefExpr::VK_WEAKREF)
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return MCSymbolRefExpr::VK_None;
60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Kind;
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
62