aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/include/llvm/MC/ConstantPools.h
blob: 95a76acd1a08af7dc27949cad86b87146c26114e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once 
 
#ifdef __GNUC__ 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-parameter" 
#endif 
 
//===- ConstantPools.h - Keep track of assembler-generated ------*- C++ -*-===// 
// 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
// See https://llvm.org/LICENSE.txt for license information. 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
// 
//===----------------------------------------------------------------------===// 
// 
// This file declares the ConstantPool and AssemblerConstantPools classes. 
// 
//===----------------------------------------------------------------------===// 
 
#ifndef LLVM_MC_CONSTANTPOOLS_H 
#define LLVM_MC_CONSTANTPOOLS_H 
 
#include "llvm/ADT/MapVector.h" 
#include "llvm/ADT/SmallVector.h" 
#include "llvm/Support/SMLoc.h" 
#include <cstdint> 
#include <map> 
 
namespace llvm { 
 
class MCContext; 
class MCExpr; 
class MCSection; 
class MCStreamer; 
class MCSymbol; 
class MCSymbolRefExpr; 
 
struct ConstantPoolEntry { 
  ConstantPoolEntry(MCSymbol *L, const MCExpr *Val, unsigned Sz, SMLoc Loc_) 
    : Label(L), Value(Val), Size(Sz), Loc(Loc_) {} 
 
  MCSymbol *Label; 
  const MCExpr *Value; 
  unsigned Size; 
  SMLoc Loc; 
}; 
 
// A class to keep track of assembler-generated constant pools that are use to 
// implement the ldr-pseudo. 
class ConstantPool { 
  using EntryVecTy = SmallVector<ConstantPoolEntry, 4>; 
  EntryVecTy Entries; 
  std::map<int64_t, const MCSymbolRefExpr *> CachedEntries; 
 
public: 
  // Initialize a new empty constant pool 
  ConstantPool() = default; 
 
  // Add a new entry to the constant pool in the next slot. 
  // \param Value is the new entry to put in the constant pool. 
  // \param Size is the size in bytes of the entry 
  // 
  // \returns a MCExpr that references the newly inserted value 
  const MCExpr *addEntry(const MCExpr *Value, MCContext &Context, 
                         unsigned Size, SMLoc Loc); 
 
  // Emit the contents of the constant pool using the provided streamer. 
  void emitEntries(MCStreamer &Streamer); 
 
  // Return true if the constant pool is empty 
  bool empty(); 
 
  void clearCache(); 
}; 
 
class AssemblerConstantPools { 
  // Map type used to keep track of per-Section constant pools used by the 
  // ldr-pseudo opcode. The map associates a section to its constant pool. The 
  // constant pool is a vector of (label, value) pairs. When the ldr 
  // pseudo is parsed we insert a new (label, value) pair into the constant pool 
  // for the current section and add MCSymbolRefExpr to the new label as 
  // an opcode to the ldr. After we have parsed all the user input we 
  // output the (label, value) pairs in each constant pool at the end of the 
  // section. 
  // 
  // We use the MapVector for the map type to ensure stable iteration of 
  // the sections at the end of the parse. We need to iterate over the 
  // sections in a stable order to ensure that we have print the 
  // constant pools in a deterministic order when printing an assembly 
  // file. 
  using ConstantPoolMapTy = MapVector<MCSection *, ConstantPool>; 
  ConstantPoolMapTy ConstantPools; 
 
public: 
  void emitAll(MCStreamer &Streamer); 
  void emitForCurrentSection(MCStreamer &Streamer); 
  void clearCacheForCurrentSection(MCStreamer &Streamer); 
  const MCExpr *addEntry(MCStreamer &Streamer, const MCExpr *Expr, 
                         unsigned Size, SMLoc Loc); 
 
private: 
  ConstantPool *getConstantPool(MCSection *Section); 
  ConstantPool &getOrCreateConstantPool(MCSection *Section); 
}; 
 
} // end namespace llvm 
 
#endif // LLVM_MC_CONSTANTPOOLS_H 
 
#ifdef __GNUC__ 
#pragma GCC diagnostic pop 
#endif