Home | History | Annotate | Download | only in MC
      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 (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);
     32   }
     33   Streamer.EmitDataRegion(MCDR_DataRegionEnd);
     34   Entries.clear();
     35 }
     36 
     37 const MCExpr *ConstantPool::addEntry(const MCExpr *Value, MCContext &Context,
     38                                      unsigned Size, SMLoc Loc) {
     39   MCSymbol *CPEntryLabel = Context.createTempSymbol();
     40 
     41   Entries.push_back(ConstantPoolEntry(CPEntryLabel, Value, Size, Loc));
     42   return MCSymbolRefExpr::create(CPEntryLabel, Context);
     43 }
     44 
     45 bool ConstantPool::empty() { return Entries.empty(); }
     46 
     47 //
     48 // AssemblerConstantPools implementation
     49 //
     50 ConstantPool *AssemblerConstantPools::getConstantPool(MCSection *Section) {
     51   ConstantPoolMapTy::iterator CP = ConstantPools.find(Section);
     52   if (CP == ConstantPools.end())
     53     return nullptr;
     54 
     55   return &CP->second;
     56 }
     57 
     58 ConstantPool &
     59 AssemblerConstantPools::getOrCreateConstantPool(MCSection *Section) {
     60   return ConstantPools[Section];
     61 }
     62 
     63 static void emitConstantPool(MCStreamer &Streamer, MCSection *Section,
     64                              ConstantPool &CP) {
     65   if (!CP.empty()) {
     66     Streamer.SwitchSection(Section);
     67     CP.emitEntries(Streamer);
     68   }
     69 }
     70 
     71 void AssemblerConstantPools::emitAll(MCStreamer &Streamer) {
     72   // Dump contents of assembler constant pools.
     73   for (auto &CPI : ConstantPools) {
     74     MCSection *Section = CPI.first;
     75     ConstantPool &CP = CPI.second;
     76 
     77     emitConstantPool(Streamer, Section, CP);
     78   }
     79 }
     80 
     81 void AssemblerConstantPools::emitForCurrentSection(MCStreamer &Streamer) {
     82   MCSection *Section = Streamer.getCurrentSection().first;
     83   if (ConstantPool *CP = getConstantPool(Section)) {
     84     emitConstantPool(Streamer, Section, *CP);
     85   }
     86 }
     87 
     88 const MCExpr *AssemblerConstantPools::addEntry(MCStreamer &Streamer,
     89                                                const MCExpr *Expr,
     90                                                unsigned Size, SMLoc Loc) {
     91   MCSection *Section = Streamer.getCurrentSection().first;
     92   return getOrCreateConstantPool(Section).addEntry(Expr, Streamer.getContext(),
     93                                                    Size, Loc);
     94 }
     95