xref: /aosp_15_r20/external/llvm/lib/MC/MCValue.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- lib/MC/MCValue.cpp - MCValue implementation ------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker 
10*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCValue.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCExpr.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
15*9880d681SAndroid Build Coastguard Worker 
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS) const18*9880d681SAndroid Build Coastguard Worker void MCValue::print(raw_ostream &OS) const {
19*9880d681SAndroid Build Coastguard Worker   if (isAbsolute()) {
20*9880d681SAndroid Build Coastguard Worker     OS << getConstant();
21*9880d681SAndroid Build Coastguard Worker     return;
22*9880d681SAndroid Build Coastguard Worker   }
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker   // FIXME: prints as a number, which isn't ideal. But the meaning will be
25*9880d681SAndroid Build Coastguard Worker   // target-specific anyway.
26*9880d681SAndroid Build Coastguard Worker   if (getRefKind())
27*9880d681SAndroid Build Coastguard Worker     OS << ':' << getRefKind() <<  ':';
28*9880d681SAndroid Build Coastguard Worker 
29*9880d681SAndroid Build Coastguard Worker   OS << *getSymA();
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker   if (getSymB()) {
32*9880d681SAndroid Build Coastguard Worker     OS << " - ";
33*9880d681SAndroid Build Coastguard Worker     OS << *getSymB();
34*9880d681SAndroid Build Coastguard Worker   }
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker   if (getConstant())
37*9880d681SAndroid Build Coastguard Worker     OS << " + " << getConstant();
38*9880d681SAndroid Build Coastguard Worker }
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const41*9880d681SAndroid Build Coastguard Worker LLVM_DUMP_METHOD void MCValue::dump() const {
42*9880d681SAndroid Build Coastguard Worker   print(dbgs());
43*9880d681SAndroid Build Coastguard Worker }
44*9880d681SAndroid Build Coastguard Worker #endif
45*9880d681SAndroid Build Coastguard Worker 
getAccessVariant() const46*9880d681SAndroid Build Coastguard Worker MCSymbolRefExpr::VariantKind MCValue::getAccessVariant() const {
47*9880d681SAndroid Build Coastguard Worker   const MCSymbolRefExpr *B = getSymB();
48*9880d681SAndroid Build Coastguard Worker   if (B) {
49*9880d681SAndroid Build Coastguard Worker     if (B->getKind() != MCSymbolRefExpr::VK_None)
50*9880d681SAndroid Build Coastguard Worker       llvm_unreachable("unsupported");
51*9880d681SAndroid Build Coastguard Worker   }
52*9880d681SAndroid Build Coastguard Worker 
53*9880d681SAndroid Build Coastguard Worker   const MCSymbolRefExpr *A = getSymA();
54*9880d681SAndroid Build Coastguard Worker   if (!A)
55*9880d681SAndroid Build Coastguard Worker     return MCSymbolRefExpr::VK_None;
56*9880d681SAndroid Build Coastguard Worker 
57*9880d681SAndroid Build Coastguard Worker   MCSymbolRefExpr::VariantKind Kind = A->getKind();
58*9880d681SAndroid Build Coastguard Worker   if (Kind == MCSymbolRefExpr::VK_WEAKREF)
59*9880d681SAndroid Build Coastguard Worker     return MCSymbolRefExpr::VK_None;
60*9880d681SAndroid Build Coastguard Worker   return Kind;
61*9880d681SAndroid Build Coastguard Worker }
62