blob: e94e9cfed394530ada826177b2c0ae72657b44ad [file] [log] [blame]
Eric Christopher276989f2017-03-31 01:46:30 +00001//===-- RecordStreamer.cpp - Record asm defined and used symbols ----------===//
Rafael Espindola13b69d62014-07-03 18:59:23 +00002//
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
Rafael Espindolaba79dba2014-07-04 22:44:18 +000010#include "RecordStreamer.h"
Rafael Espindola13b69d62014-07-03 18:59:23 +000011#include "llvm/MC/MCSymbol.h"
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000012
Rafael Espindola13b69d62014-07-03 18:59:23 +000013using namespace llvm;
14
15void RecordStreamer::markDefined(const MCSymbol &Symbol) {
16 State &S = Symbols[Symbol.getName()];
17 switch (S) {
18 case DefinedGlobal:
19 case Global:
20 S = DefinedGlobal;
21 break;
22 case NeverSeen:
23 case Defined:
24 case Used:
25 S = Defined;
26 break;
Davide Italianof7518492016-09-15 17:54:22 +000027 case DefinedWeak:
Davide Italianoec7e29e2016-06-22 20:48:15 +000028 break;
Davide Italianof7518492016-09-15 17:54:22 +000029 case UndefinedWeak:
30 S = DefinedWeak;
Rafael Espindola13b69d62014-07-03 18:59:23 +000031 }
32}
33
Davide Italianoec7e29e2016-06-22 20:48:15 +000034void RecordStreamer::markGlobal(const MCSymbol &Symbol,
35 MCSymbolAttr Attribute) {
Rafael Espindola13b69d62014-07-03 18:59:23 +000036 State &S = Symbols[Symbol.getName()];
37 switch (S) {
38 case DefinedGlobal:
39 case Defined:
Davide Italianof7518492016-09-15 17:54:22 +000040 S = (Attribute == MCSA_Weak) ? DefinedWeak : DefinedGlobal;
Rafael Espindola13b69d62014-07-03 18:59:23 +000041 break;
42
43 case NeverSeen:
44 case Global:
45 case Used:
Davide Italianof7518492016-09-15 17:54:22 +000046 S = (Attribute == MCSA_Weak) ? UndefinedWeak : Global;
Davide Italianoec7e29e2016-06-22 20:48:15 +000047 break;
Davide Italianof7518492016-09-15 17:54:22 +000048 case UndefinedWeak:
49 case DefinedWeak:
Rafael Espindola13b69d62014-07-03 18:59:23 +000050 break;
51 }
52}
53
54void RecordStreamer::markUsed(const MCSymbol &Symbol) {
55 State &S = Symbols[Symbol.getName()];
56 switch (S) {
57 case DefinedGlobal:
58 case Defined:
59 case Global:
Davide Italianof7518492016-09-15 17:54:22 +000060 case DefinedWeak:
61 case UndefinedWeak:
Rafael Espindola13b69d62014-07-03 18:59:23 +000062 break;
63
64 case NeverSeen:
65 case Used:
66 S = Used;
67 break;
68 }
69}
70
71void RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); }
72
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000073RecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
74
Rafael Espindola13b69d62014-07-03 18:59:23 +000075RecordStreamer::const_iterator RecordStreamer::begin() {
76 return Symbols.begin();
77}
78
79RecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); }
80
Rafael Espindola13b69d62014-07-03 18:59:23 +000081void RecordStreamer::EmitInstruction(const MCInst &Inst,
Andrew V. Tischenko75745d02017-04-14 07:44:23 +000082 const MCSubtargetInfo &STI, bool) {
Rafael Espindola13b69d62014-07-03 18:59:23 +000083 MCStreamer::EmitInstruction(Inst, STI);
84}
85
Rafael Espindolabe991572017-02-10 15:13:12 +000086void RecordStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) {
Rafael Espindola13b69d62014-07-03 18:59:23 +000087 MCStreamer::EmitLabel(Symbol);
88 markDefined(*Symbol);
89}
90
91void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
92 markDefined(*Symbol);
93 MCStreamer::EmitAssignment(Symbol, Value);
94}
95
96bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
97 MCSymbolAttr Attribute) {
Davide Italiano16bfa132016-06-17 18:20:14 +000098 if (Attribute == MCSA_Global || Attribute == MCSA_Weak)
Davide Italianoec7e29e2016-06-22 20:48:15 +000099 markGlobal(*Symbol, Attribute);
Mehdi Aminif9721ba2016-08-03 03:51:42 +0000100 if (Attribute == MCSA_LazyReference)
101 markUsed(*Symbol);
Rafael Espindola13b69d62014-07-03 18:59:23 +0000102 return true;
103}
104
Rafael Espindola0709a7b2015-05-21 19:20:38 +0000105void RecordStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
Rafael Espindola13b69d62014-07-03 18:59:23 +0000106 uint64_t Size, unsigned ByteAlignment) {
107 markDefined(*Symbol);
108}
109
110void RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
111 unsigned ByteAlignment) {
112 markDefined(*Symbol);
113}
Teresa Johnsond8204472017-03-09 00:19:49 +0000114
115void RecordStreamer::emitELFSymverDirective(MCSymbol *Alias,
116 const MCSymbol *Aliasee) {
117 SymverAliasMap[Aliasee].push_back(Alias);
118}