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