[MC/AsmParser] Avoid setting MCSymbol.IsUsed in some cases
[oota-llvm.git] / lib / MC / ConstantPools.cpp
1 //===- 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"
14 #include "llvm/MC/ConstantPools.h"
15 #include "llvm/MC/MCContext.h"
16 #include "llvm/MC/MCExpr.h"
17 #include "llvm/MC/MCStreamer.h"
18
19 using namespace llvm;
20 //
21 // ConstantPool implementation
22 //
23 // Emit the contents of the constant pool using the provided streamer.
24 void ConstantPool::emitEntries(MCStreamer &Streamer) {
25   if (Entries.empty())
26     return;
27   Streamer.EmitDataRegion(MCDR_DataRegion);
28   for (EntryVecTy::const_iterator I = Entries.begin(), E = Entries.end();
29        I != E; ++I) {
30     Streamer.EmitCodeAlignment(I->Size); // align naturally
31     Streamer.EmitLabel(I->Label);
32     Streamer.EmitValue(I->Value, I->Size);
33   }
34   Streamer.EmitDataRegion(MCDR_DataRegionEnd);
35   Entries.clear();
36 }
37
38 const MCExpr *ConstantPool::addEntry(const MCExpr *Value, MCContext &Context,
39                                      unsigned Size) {
40   MCSymbol *CPEntryLabel = Context.createTempSymbol();
41
42   Entries.push_back(ConstantPoolEntry(CPEntryLabel, Value, Size));
43   return MCSymbolRefExpr::create(CPEntryLabel, Context);
44 }
45
46 bool ConstantPool::empty() { return Entries.empty(); }
47
48 //
49 // AssemblerConstantPools implementation
50 //
51 ConstantPool *AssemblerConstantPools::getConstantPool(MCSection *Section) {
52   ConstantPoolMapTy::iterator CP = ConstantPools.find(Section);
53   if (CP == ConstantPools.end())
54     return nullptr;
55
56   return &CP->second;
57 }
58
59 ConstantPool &
60 AssemblerConstantPools::getOrCreateConstantPool(MCSection *Section) {
61   return ConstantPools[Section];
62 }
63
64 static void emitConstantPool(MCStreamer &Streamer, MCSection *Section,
65                              ConstantPool &CP) {
66   if (!CP.empty()) {
67     Streamer.SwitchSection(Section);
68     CP.emitEntries(Streamer);
69   }
70 }
71
72 void 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) {
77     MCSection *Section = CPI->first;
78     ConstantPool &CP = CPI->second;
79
80     emitConstantPool(Streamer, Section, CP);
81   }
82 }
83
84 void AssemblerConstantPools::emitForCurrentSection(MCStreamer &Streamer) {
85   MCSection *Section = Streamer.getCurrentSection().first;
86   if (ConstantPool *CP = getConstantPool(Section)) {
87     emitConstantPool(Streamer, Section, *CP);
88   }
89 }
90
91 const MCExpr *AssemblerConstantPools::addEntry(MCStreamer &Streamer,
92                                                const MCExpr *Expr,
93                                                unsigned Size) {
94   MCSection *Section = Streamer.getCurrentSection().first;
95   return getOrCreateConstantPool(Section).addEntry(Expr, Streamer.getContext(),
96                                                    Size);
97 }