1198090Srdivacky//===- lib/MC/MCValue.cpp - MCValue implementation ------------------------===//
2198090Srdivacky//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6198090Srdivacky//
7198090Srdivacky//===----------------------------------------------------------------------===//
8198090Srdivacky
9198090Srdivacky#include "llvm/MC/MCValue.h"
10341825Sdim#include "llvm/Config/llvm-config.h"
11205407Srdivacky#include "llvm/MC/MCExpr.h"
12202375Srdivacky#include "llvm/Support/Debug.h"
13276479Sdim#include "llvm/Support/ErrorHandling.h"
14198090Srdivacky#include "llvm/Support/raw_ostream.h"
15198090Srdivacky
16198090Srdivackyusing namespace llvm;
17198090Srdivacky
18288943Sdimvoid MCValue::print(raw_ostream &OS) const {
19198090Srdivacky  if (isAbsolute()) {
20198090Srdivacky    OS << getConstant();
21198090Srdivacky    return;
22198090Srdivacky  }
23198090Srdivacky
24276479Sdim  // FIXME: prints as a number, which isn't ideal. But the meaning will be
25276479Sdim  // target-specific anyway.
26276479Sdim  if (getRefKind())
27276479Sdim    OS << ':' << getRefKind() <<  ':';
28276479Sdim
29288943Sdim  OS << *getSymA();
30198090Srdivacky
31205407Srdivacky  if (getSymB()) {
32205407Srdivacky    OS << " - ";
33288943Sdim    OS << *getSymB();
34205407Srdivacky  }
35198090Srdivacky
36198090Srdivacky  if (getConstant())
37198090Srdivacky    OS << " + " << getConstant();
38198090Srdivacky}
39198090Srdivacky
40321369Sdim#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
41309124SdimLLVM_DUMP_METHOD void MCValue::dump() const {
42288943Sdim  print(dbgs());
43198090Srdivacky}
44321369Sdim#endif
45276479Sdim
46276479SdimMCSymbolRefExpr::VariantKind MCValue::getAccessVariant() const {
47276479Sdim  const MCSymbolRefExpr *B = getSymB();
48276479Sdim  if (B) {
49276479Sdim    if (B->getKind() != MCSymbolRefExpr::VK_None)
50276479Sdim      llvm_unreachable("unsupported");
51276479Sdim  }
52276479Sdim
53276479Sdim  const MCSymbolRefExpr *A = getSymA();
54276479Sdim  if (!A)
55276479Sdim    return MCSymbolRefExpr::VK_None;
56276479Sdim
57360784Sdim  return A->getKind();
58276479Sdim}
59