1cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===-- RecordStreamer.cpp - Record asm definde and used symbols ----------===// 2cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 3cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// The LLVM Compiler Infrastructure 4cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 5cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// This file is distributed under the University of Illinois Open Source 6cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// License. See LICENSE.TXT for details. 7cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 8cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===----------------------------------------------------------------------===// 9cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 10cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "RecordStreamer.h" 11cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/MC/MCSymbol.h" 12cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesusing namespace llvm; 13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::markDefined(const MCSymbol &Symbol) { 15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines State &S = Symbols[Symbol.getName()]; 16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines switch (S) { 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case DefinedGlobal: 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Global: 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines S = DefinedGlobal; 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case NeverSeen: 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Defined: 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Used: 24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines S = Defined; 25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::markGlobal(const MCSymbol &Symbol) { 30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines State &S = Symbols[Symbol.getName()]; 31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines switch (S) { 32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case DefinedGlobal: 33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Defined: 34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines S = DefinedGlobal; 35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case NeverSeen: 38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Global: 39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Used: 40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines S = Global; 41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::markUsed(const MCSymbol &Symbol) { 46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines State &S = Symbols[Symbol.getName()]; 47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines switch (S) { 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case DefinedGlobal: 49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Defined: 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Global: 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case NeverSeen: 54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines case Used: 55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines S = Used; 56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines break; 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); } 61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesRecordStreamer::const_iterator RecordStreamer::begin() { 63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return Symbols.begin(); 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesRecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); } 67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesRecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {} 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::EmitInstruction(const MCInst &Inst, 71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const MCSubtargetInfo &STI) { 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCStreamer::EmitInstruction(Inst, STI); 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::EmitLabel(MCSymbol *Symbol) { 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCStreamer::EmitLabel(Symbol); 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines markDefined(*Symbol); 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) { 81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines markDefined(*Symbol); 82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCStreamer::EmitAssignment(Symbol, Value); 83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol, 86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MCSymbolAttr Attribute) { 87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (Attribute == MCSA_Global) 88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines markGlobal(*Symbol); 89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return true; 90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::EmitZerofill(const MCSection *Section, MCSymbol *Symbol, 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines uint64_t Size, unsigned ByteAlignment) { 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines markDefined(*Symbol); 95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesvoid RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines unsigned ByteAlignment) { 99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines markDefined(*Symbol); 100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 101