blob: a723aa8fa4090c558f3b66c4263e2b1edbfc462f [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);
28 for (EntryVecTy::const_iterator I = Entries.begin(), E = Entries.end();
29 I != E; ++I) {
David Peixottoae5ba762014-07-18 16:05:14 +000030 Streamer.EmitCodeAlignment(I->Size); // align naturally
31 Streamer.EmitLabel(I->Label);
32 Streamer.EmitValue(I->Value, I->Size);
Weiming Zhao8c899732014-06-18 18:17:25 +000033 }
34 Streamer.EmitDataRegion(MCDR_DataRegionEnd);
35 Entries.clear();
36}
37
David Peixottoae5ba762014-07-18 16:05:14 +000038const MCExpr *ConstantPool::addEntry(const MCExpr *Value, MCContext &Context,
39 unsigned Size) {
Jim Grosbach6f482002015-05-18 18:43:14 +000040 MCSymbol *CPEntryLabel = Context.createTempSymbol();
Weiming Zhao8c899732014-06-18 18:17:25 +000041
David Peixottob0b3e662014-07-18 16:41:58 +000042 Entries.push_back(ConstantPoolEntry(CPEntryLabel, Value, Size));
Weiming Zhao8c899732014-06-18 18:17:25 +000043 return MCSymbolRefExpr::Create(CPEntryLabel, Context);
44}
45
46bool ConstantPool::empty() { return Entries.empty(); }
47
48//
49// AssemblerConstantPools implementation
50//
Rafael Espindola0709a7b2015-05-21 19:20:38 +000051ConstantPool *AssemblerConstantPools::getConstantPool(MCSection *Section) {
Weiming Zhao8c899732014-06-18 18:17:25 +000052 ConstantPoolMapTy::iterator CP = ConstantPools.find(Section);
53 if (CP == ConstantPools.end())
54 return nullptr;
55
56 return &CP->second;
57}
58
59ConstantPool &
Rafael Espindola0709a7b2015-05-21 19:20:38 +000060AssemblerConstantPools::getOrCreateConstantPool(MCSection *Section) {
Weiming Zhao8c899732014-06-18 18:17:25 +000061 return ConstantPools[Section];
62}
63
Rafael Espindola0709a7b2015-05-21 19:20:38 +000064static void emitConstantPool(MCStreamer &Streamer, MCSection *Section,
Weiming Zhao8c899732014-06-18 18:17:25 +000065 ConstantPool &CP) {
66 if (!CP.empty()) {
67 Streamer.SwitchSection(Section);
68 CP.emitEntries(Streamer);
69 }
70}
71
72void AssemblerConstantPools::emitAll(MCStreamer &Streamer) {
73 // Dump contents of assembler constant pools.
74 for (ConstantPoolMapTy::iterator CPI = ConstantPools.begin(),
75 CPE = ConstantPools.end();
76 CPI != CPE; ++CPI) {
Rafael Espindola0709a7b2015-05-21 19:20:38 +000077 MCSection *Section = CPI->first;
Weiming Zhao8c899732014-06-18 18:17:25 +000078 ConstantPool &CP = CPI->second;
79
80 emitConstantPool(Streamer, Section, CP);
81 }
82}
83
84void AssemblerConstantPools::emitForCurrentSection(MCStreamer &Streamer) {
Rafael Espindola0709a7b2015-05-21 19:20:38 +000085 MCSection *Section = Streamer.getCurrentSection().first;
Weiming Zhao8c899732014-06-18 18:17:25 +000086 if (ConstantPool *CP = getConstantPool(Section)) {
87 emitConstantPool(Streamer, Section, *CP);
88 }
89}
90
91const MCExpr *AssemblerConstantPools::addEntry(MCStreamer &Streamer,
David Peixottoae5ba762014-07-18 16:05:14 +000092 const MCExpr *Expr,
93 unsigned Size) {
Rafael Espindola0709a7b2015-05-21 19:20:38 +000094 MCSection *Section = Streamer.getCurrentSection().first;
David Peixottoae5ba762014-07-18 16:05:14 +000095 return getOrCreateConstantPool(Section).addEntry(Expr, Streamer.getContext(),
96 Size);
Weiming Zhao8c899732014-06-18 18:17:25 +000097}