| //===-- RecordStreamer.cpp - Record asm defined and used symbols ----------===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "RecordStreamer.h" |
| #include "llvm/MC/MCSymbol.h" |
| |
| using namespace llvm; |
| |
| void RecordStreamer::markDefined(const MCSymbol &Symbol) { |
| State &S = Symbols[Symbol.getName()]; |
| switch (S) { |
| case DefinedGlobal: |
| case Global: |
| S = DefinedGlobal; |
| break; |
| case NeverSeen: |
| case Defined: |
| case Used: |
| S = Defined; |
| break; |
| case DefinedWeak: |
| break; |
| case UndefinedWeak: |
| S = DefinedWeak; |
| } |
| } |
| |
| void RecordStreamer::markGlobal(const MCSymbol &Symbol, |
| MCSymbolAttr Attribute) { |
| State &S = Symbols[Symbol.getName()]; |
| switch (S) { |
| case DefinedGlobal: |
| case Defined: |
| S = (Attribute == MCSA_Weak) ? DefinedWeak : DefinedGlobal; |
| break; |
| |
| case NeverSeen: |
| case Global: |
| case Used: |
| S = (Attribute == MCSA_Weak) ? UndefinedWeak : Global; |
| break; |
| case UndefinedWeak: |
| case DefinedWeak: |
| break; |
| } |
| } |
| |
| void RecordStreamer::markUsed(const MCSymbol &Symbol) { |
| State &S = Symbols[Symbol.getName()]; |
| switch (S) { |
| case DefinedGlobal: |
| case Defined: |
| case Global: |
| case DefinedWeak: |
| case UndefinedWeak: |
| break; |
| |
| case NeverSeen: |
| case Used: |
| S = Used; |
| break; |
| } |
| } |
| |
| void RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); } |
| |
| RecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {} |
| |
| RecordStreamer::const_iterator RecordStreamer::begin() { |
| return Symbols.begin(); |
| } |
| |
| RecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); } |
| |
| void RecordStreamer::EmitInstruction(const MCInst &Inst, |
| const MCSubtargetInfo &STI, bool) { |
| MCStreamer::EmitInstruction(Inst, STI); |
| } |
| |
| void RecordStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) { |
| MCStreamer::EmitLabel(Symbol); |
| markDefined(*Symbol); |
| } |
| |
| void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { |
| markDefined(*Symbol); |
| MCStreamer::EmitAssignment(Symbol, Value); |
| } |
| |
| bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol, |
| MCSymbolAttr Attribute) { |
| if (Attribute == MCSA_Global || Attribute == MCSA_Weak) |
| markGlobal(*Symbol, Attribute); |
| if (Attribute == MCSA_LazyReference) |
| markUsed(*Symbol); |
| return true; |
| } |
| |
| void RecordStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, |
| uint64_t Size, unsigned ByteAlignment) { |
| markDefined(*Symbol); |
| } |
| |
| void RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, |
| unsigned ByteAlignment) { |
| markDefined(*Symbol); |
| } |
| |
| void RecordStreamer::emitELFSymverDirective(MCSymbol *Alias, |
| const MCSymbol *Aliasee) { |
| SymverAliasMap[Aliasee].push_back(Alias); |
| } |