blob: 17a23d063b7d0ba4c15ef74bcf3a63becd9ebb82 [file] [log] [blame]
Weiming Zhao8c899732014-06-18 18:17:25 +00001//===- ConstantPools.cpp - ConstantPool class --*- 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 implements the ConstantPool and AssemblerConstantPools classes.
11//
12//===----------------------------------------------------------------------===//
13#include "llvm/ADT/MapVector.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000014#include "llvm/MC/ConstantPools.h"
Weiming Zhao8c899732014-06-18 18:17:25 +000015#include "llvm/MC/MCContext.h"
16#include "llvm/MC/MCExpr.h"
17#include "llvm/MC/MCStreamer.h"
Weiming Zhao8c899732014-06-18 18:17:25 +000018
19using namespace llvm;
20//
21// ConstantPool implementation
22//
23// Emit the contents of the constant pool using the provided streamer.
24void ConstantPool::emitEntries(MCStreamer &Streamer) {
25 if (Entries.empty())
26 return;
Weiming Zhao8c899732014-06-18 18:17:25 +000027 Streamer.EmitDataRegion(MCDR_DataRegion);
Benjamin Kramer7b4658f2016-06-26 14:49:00 +000028 for (const ConstantPoolEntry &Entry : Entries) {
29 Streamer.EmitCodeAlignment(Entry.Size); // align naturally
30 Streamer.EmitLabel(Entry.Label);
31 Streamer.EmitValue(Entry.Value, Entry.Size, Entry.Loc);
Weiming Zhao8c899732014-06-18 18:17:25 +000032 }
33 Streamer.EmitDataRegion(MCDR_DataRegionEnd);
34 Entries.clear();
35}
36
David Peixottoae5ba762014-07-18 16:05:14 +000037const MCExpr *ConstantPool::addEntry(const MCExpr *Value, MCContext &Context,
Oliver Stannard9327a752015-11-16 16:25:47 +000038 unsigned Size, SMLoc Loc) {
Jim Grosbach6f482002015-05-18 18:43:14 +000039 MCSymbol *CPEntryLabel = Context.createTempSymbol();
Weiming Zhao8c899732014-06-18 18:17:25 +000040
Oliver Stannard9327a752015-11-16 16:25:47 +000041 Entries.push_back(ConstantPoolEntry(CPEntryLabel, Value, Size, Loc));
Jim Grosbach13760bd2015-05-30 01:25:56 +000042 return MCSymbolRefExpr::create(CPEntryLabel, Context);
Weiming Zhao8c899732014-06-18 18:17:25 +000043}
44
45bool ConstantPool::empty() { return Entries.empty(); }
46
47//
48// AssemblerConstantPools implementation
49//
Rafael Espindola0709a7b2015-05-21 19:20:38 +000050ConstantPool *AssemblerConstantPools::getConstantPool(MCSection *Section) {
Weiming Zhao8c899732014-06-18 18:17:25 +000051 ConstantPoolMapTy::iterator CP = ConstantPools.find(Section);
52 if (CP == ConstantPools.end())
53 return nullptr;
54
55 return &CP->second;
56}
57
58ConstantPool &
Rafael Espindola0709a7b2015-05-21 19:20:38 +000059AssemblerConstantPools::getOrCreateConstantPool(MCSection *Section) {
Weiming Zhao8c899732014-06-18 18:17:25 +000060 return ConstantPools[Section];
61}
62
Rafael Espindola0709a7b2015-05-21 19:20:38 +000063static void emitConstantPool(MCStreamer &Streamer, MCSection *Section,
Weiming Zhao8c899732014-06-18 18:17:25 +000064 ConstantPool &CP) {
65 if (!CP.empty()) {
66 Streamer.SwitchSection(Section);
67 CP.emitEntries(Streamer);
68 }
69}
70
71void AssemblerConstantPools::emitAll(MCStreamer &Streamer) {
72 // Dump contents of assembler constant pools.
Benjamin Kramer7b4658f2016-06-26 14:49:00 +000073 for (auto &CPI : ConstantPools) {
74 MCSection *Section = CPI.first;
75 ConstantPool &CP = CPI.second;
Weiming Zhao8c899732014-06-18 18:17:25 +000076
77 emitConstantPool(Streamer, Section, CP);
78 }
79}
80
81void AssemblerConstantPools::emitForCurrentSection(MCStreamer &Streamer) {
Rafael Espindola0709a7b2015-05-21 19:20:38 +000082 MCSection *Section = Streamer.getCurrentSection().first;
Weiming Zhao8c899732014-06-18 18:17:25 +000083 if (ConstantPool *CP = getConstantPool(Section)) {
84 emitConstantPool(Streamer, Section, *CP);
85 }
86}
87
88const MCExpr *AssemblerConstantPools::addEntry(MCStreamer &Streamer,
David Peixottoae5ba762014-07-18 16:05:14 +000089 const MCExpr *Expr,
Oliver Stannard9327a752015-11-16 16:25:47 +000090 unsigned Size, SMLoc Loc) {
Rafael Espindola0709a7b2015-05-21 19:20:38 +000091 MCSection *Section = Streamer.getCurrentSection().first;
David Peixottoae5ba762014-07-18 16:05:14 +000092 return getOrCreateConstantPool(Section).addEntry(Expr, Streamer.getContext(),
Oliver Stannard9327a752015-11-16 16:25:47 +000093 Size, Loc);
Weiming Zhao8c899732014-06-18 18:17:25 +000094}