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