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 case DefinedWeak: 27 break; 28 case UndefinedWeak: 29 S = DefinedWeak; 30 } 31 } 32 33 void RecordStreamer::markGlobal(const MCSymbol &Symbol, 34 MCSymbolAttr Attribute) { 35 State &S = Symbols[Symbol.getName()]; 36 switch (S) { 37 case DefinedGlobal: 38 case Defined: 39 S = (Attribute == MCSA_Weak) ? DefinedWeak : DefinedGlobal; 40 break; 41 42 case NeverSeen: 43 case Global: 44 case Used: 45 S = (Attribute == MCSA_Weak) ? UndefinedWeak : Global; 46 break; 47 case UndefinedWeak: 48 case DefinedWeak: 49 break; 50 } 51 } 52 53 void RecordStreamer::markUsed(const MCSymbol &Symbol) { 54 State &S = Symbols[Symbol.getName()]; 55 switch (S) { 56 case DefinedGlobal: 57 case Defined: 58 case Global: 59 case DefinedWeak: 60 case UndefinedWeak: 61 break; 62 63 case NeverSeen: 64 case Used: 65 S = Used; 66 break; 67 } 68 } 69 70 void RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); } 71 72 RecordStreamer::const_iterator RecordStreamer::begin() { 73 return Symbols.begin(); 74 } 75 76 RecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); } 77 78 RecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {} 79 80 void RecordStreamer::EmitInstruction(const MCInst &Inst, 81 const MCSubtargetInfo &STI) { 82 MCStreamer::EmitInstruction(Inst, STI); 83 } 84 85 void RecordStreamer::EmitLabel(MCSymbol *Symbol) { 86 MCStreamer::EmitLabel(Symbol); 87 markDefined(*Symbol); 88 } 89 90 void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { 91 markDefined(*Symbol); 92 MCStreamer::EmitAssignment(Symbol, Value); 93 } 94 95 bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol, 96 MCSymbolAttr Attribute) { 97 if (Attribute == MCSA_Global || Attribute == MCSA_Weak) 98 markGlobal(*Symbol, Attribute); 99 if (Attribute == MCSA_LazyReference) 100 markUsed(*Symbol); 101 return true; 102 } 103 104 void RecordStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, 105 uint64_t Size, unsigned ByteAlignment) { 106 markDefined(*Symbol); 107 } 108 109 void RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 110 unsigned ByteAlignment) { 111 markDefined(*Symbol); 112 } 113