Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/include/llvm/MC/MCValue.h
Line
Count
Source
1
//===-- llvm/MC/MCValue.h - MCValue class -----------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file contains the declaration of the MCValue class.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_MC_MCVALUE_H
14
#define LLVM_MC_MCVALUE_H
15
16
#include "llvm/MC/MCExpr.h"
17
#include "llvm/MC/MCSymbol.h"
18
#include "llvm/Support/DataTypes.h"
19
#include <cassert>
20
21
namespace llvm {
22
class MCAsmInfo;
23
class raw_ostream;
24
25
/// This represents an "assembler immediate".
26
///
27
///  In its most general form, this can hold ":Kind:(SymbolA - SymbolB +
28
///  imm64)".  Not all targets supports relocations of this general form, but we
29
///  need to represent this anyway.
30
///
31
/// In general both SymbolA and SymbolB will also have a modifier
32
/// analogous to the top-level Kind. Current targets are not expected
33
/// to make use of both though. The choice comes down to whether
34
/// relocation modifiers apply to the closest symbol or the whole
35
/// expression.
36
///
37
/// Note that this class must remain a simple POD value class, because we need
38
/// it to live in unions etc.
39
class MCValue {
40
  const MCSymbolRefExpr *SymA = nullptr, *SymB = nullptr;
41
  int64_t Cst = 0;
42
  uint32_t RefKind = 0;
43
44
public:
45
66.7M
  MCValue() = default;
46
32.3M
  int64_t getConstant() const { return Cst; }
47
48.1M
  const MCSymbolRefExpr *getSymA() const { return SymA; }
48
41.1M
  const MCSymbolRefExpr *getSymB() const { return SymB; }
49
3.31M
  uint32_t getRefKind() const { return RefKind; }
50
51
  /// Is this an absolute (as opposed to relocatable) value.
52
19.6M
  bool isAbsolute() const { return !SymA && 
!SymB4.36M
; }
53
54
  /// Print the value to the stream \p OS.
55
  void print(raw_ostream &OS) const;
56
57
  /// Print the value to stderr.
58
  void dump() const;
59
60
  MCSymbolRefExpr::VariantKind getAccessVariant() const;
61
62
  static MCValue get(const MCSymbolRefExpr *SymA,
63
                     const MCSymbolRefExpr *SymB = nullptr,
64
27.4M
                     int64_t Val = 0, uint32_t RefKind = 0) {
65
27.4M
    MCValue R;
66
27.4M
    R.Cst = Val;
67
27.4M
    R.SymA = SymA;
68
27.4M
    R.SymB = SymB;
69
27.4M
    R.RefKind = RefKind;
70
27.4M
    return R;
71
27.4M
  }
72
73
1.80M
  static MCValue get(int64_t Val) {
74
1.80M
    MCValue R;
75
1.80M
    R.Cst = Val;
76
1.80M
    R.SymA = nullptr;
77
1.80M
    R.SymB = nullptr;
78
1.80M
    R.RefKind = 0;
79
1.80M
    return R;
80
1.80M
  }
81
82
};
83
84
} // end namespace llvm
85
86
#endif