Home | History | Annotate | Download | only in Object
      1 //===-- RecordStreamer.cpp - Record asm definde and used symbols ----------===//
      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 #include "RecordStreamer.h"
     11 #include "llvm/MC/MCSymbol.h"
     12 using namespace llvm;
     13 
     14 void RecordStreamer::markDefined(const MCSymbol &Symbol) {
     15   State &S = Symbols[Symbol.getName()];
     16   switch (S) {
     17   case DefinedGlobal:
     18   case Global:
     19     S = DefinedGlobal;
     20     break;
     21   case NeverSeen:
     22   case Defined:
     23   case Used:
     24     S = Defined;
     25     break;
     26   }
     27 }
     28 
     29 void RecordStreamer::markGlobal(const MCSymbol &Symbol) {
     30   State &S = Symbols[Symbol.getName()];
     31   switch (S) {
     32   case DefinedGlobal:
     33   case Defined:
     34     S = DefinedGlobal;
     35     break;
     36 
     37   case NeverSeen:
     38   case Global:
     39   case Used:
     40     S = Global;
     41     break;
     42   }
     43 }
     44 
     45 void RecordStreamer::markUsed(const MCSymbol &Symbol) {
     46   State &S = Symbols[Symbol.getName()];
     47   switch (S) {
     48   case DefinedGlobal:
     49   case Defined:
     50   case Global:
     51     break;
     52 
     53   case NeverSeen:
     54   case Used:
     55     S = Used;
     56     break;
     57   }
     58 }
     59 
     60 void RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); }
     61 
     62 RecordStreamer::const_iterator RecordStreamer::begin() {
     63   return Symbols.begin();
     64 }
     65 
     66 RecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); }
     67 
     68 RecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
     69 
     70 void RecordStreamer::EmitInstruction(const MCInst &Inst,
     71                                      const MCSubtargetInfo &STI) {
     72   MCStreamer::EmitInstruction(Inst, STI);
     73 }
     74 
     75 void RecordStreamer::EmitLabel(MCSymbol *Symbol) {
     76   MCStreamer::EmitLabel(Symbol);
     77   markDefined(*Symbol);
     78 }
     79 
     80 void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
     81   markDefined(*Symbol);
     82   MCStreamer::EmitAssignment(Symbol, Value);
     83 }
     84 
     85 bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
     86                                          MCSymbolAttr Attribute) {
     87   if (Attribute == MCSA_Global)
     88     markGlobal(*Symbol);
     89   return true;
     90 }
     91 
     92 void RecordStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol,
     93                                   uint64_t Size, unsigned ByteAlignment) {
     94   markDefined(*Symbol);
     95 }
     96 
     97 void RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
     98                                       unsigned ByteAlignment) {
     99   markDefined(*Symbol);
    100 }
    101