blob: 56e9ce7304758beacdcd23e2c4e169c3023c5258 [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 Espindola47b4d6b2018-03-09 18:42:25 +000011#include "llvm/MC/MCContext.h"
Rafael Espindola13b69d62014-07-03 18:59:23 +000012#include "llvm/MC/MCSymbol.h"
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000013
Rafael Espindola13b69d62014-07-03 18:59:23 +000014using namespace llvm;
15
16void RecordStreamer::markDefined(const MCSymbol &Symbol) {
17 State &S = Symbols[Symbol.getName()];
18 switch (S) {
19 case DefinedGlobal:
20 case Global:
21 S = DefinedGlobal;
22 break;
23 case NeverSeen:
24 case Defined:
25 case Used:
26 S = Defined;
27 break;
Davide Italianof7518492016-09-15 17:54:22 +000028 case DefinedWeak:
Davide Italianoec7e29e2016-06-22 20:48:15 +000029 break;
Davide Italianof7518492016-09-15 17:54:22 +000030 case UndefinedWeak:
31 S = DefinedWeak;
Rafael Espindola13b69d62014-07-03 18:59:23 +000032 }
33}
34
Davide Italianoec7e29e2016-06-22 20:48:15 +000035void RecordStreamer::markGlobal(const MCSymbol &Symbol,
36 MCSymbolAttr Attribute) {
Rafael Espindola13b69d62014-07-03 18:59:23 +000037 State &S = Symbols[Symbol.getName()];
38 switch (S) {
39 case DefinedGlobal:
40 case Defined:
Davide Italianof7518492016-09-15 17:54:22 +000041 S = (Attribute == MCSA_Weak) ? DefinedWeak : DefinedGlobal;
Rafael Espindola13b69d62014-07-03 18:59:23 +000042 break;
43
44 case NeverSeen:
45 case Global:
46 case Used:
Davide Italianof7518492016-09-15 17:54:22 +000047 S = (Attribute == MCSA_Weak) ? UndefinedWeak : Global;
Davide Italianoec7e29e2016-06-22 20:48:15 +000048 break;
Davide Italianof7518492016-09-15 17:54:22 +000049 case UndefinedWeak:
50 case DefinedWeak:
Rafael Espindola13b69d62014-07-03 18:59:23 +000051 break;
52 }
53}
54
55void RecordStreamer::markUsed(const MCSymbol &Symbol) {
56 State &S = Symbols[Symbol.getName()];
57 switch (S) {
58 case DefinedGlobal:
59 case Defined:
60 case Global:
Davide Italianof7518492016-09-15 17:54:22 +000061 case DefinedWeak:
62 case UndefinedWeak:
Rafael Espindola13b69d62014-07-03 18:59:23 +000063 break;
64
65 case NeverSeen:
66 case Used:
67 S = Used;
68 break;
69 }
70}
71
72void RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); }
73
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000074RecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
75
Rafael Espindola13b69d62014-07-03 18:59:23 +000076RecordStreamer::const_iterator RecordStreamer::begin() {
77 return Symbols.begin();
78}
79
80RecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); }
81
Rafael Espindola13b69d62014-07-03 18:59:23 +000082void RecordStreamer::EmitInstruction(const MCInst &Inst,
Andrew V. Tischenko75745d02017-04-14 07:44:23 +000083 const MCSubtargetInfo &STI, bool) {
Rafael Espindola13b69d62014-07-03 18:59:23 +000084 MCStreamer::EmitInstruction(Inst, STI);
85}
86
Rafael Espindolabe991572017-02-10 15:13:12 +000087void RecordStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) {
Rafael Espindola13b69d62014-07-03 18:59:23 +000088 MCStreamer::EmitLabel(Symbol);
89 markDefined(*Symbol);
90}
91
92void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
93 markDefined(*Symbol);
94 MCStreamer::EmitAssignment(Symbol, Value);
95}
96
97bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
98 MCSymbolAttr Attribute) {
Davide Italiano16bfa132016-06-17 18:20:14 +000099 if (Attribute == MCSA_Global || Attribute == MCSA_Weak)
Davide Italianoec7e29e2016-06-22 20:48:15 +0000100 markGlobal(*Symbol, Attribute);
Mehdi Aminif9721ba2016-08-03 03:51:42 +0000101 if (Attribute == MCSA_LazyReference)
102 markUsed(*Symbol);
Rafael Espindola13b69d62014-07-03 18:59:23 +0000103 return true;
104}
105
Rafael Espindola0709a7b2015-05-21 19:20:38 +0000106void RecordStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
Rafael Espindola13b69d62014-07-03 18:59:23 +0000107 uint64_t Size, unsigned ByteAlignment) {
108 markDefined(*Symbol);
109}
110
111void RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
112 unsigned ByteAlignment) {
113 markDefined(*Symbol);
114}
Teresa Johnsond8204472017-03-09 00:19:49 +0000115
Rafael Espindola47b4d6b2018-03-09 18:42:25 +0000116void RecordStreamer::emitELFSymverDirective(StringRef AliasName,
Teresa Johnsond8204472017-03-09 00:19:49 +0000117 const MCSymbol *Aliasee) {
Rafael Espindola47b4d6b2018-03-09 18:42:25 +0000118 MCSymbol *Alias = getContext().getOrCreateSymbol(AliasName);
Rafael Espindola81e911c2018-03-09 03:13:37 +0000119 const MCExpr *Value = MCSymbolRefExpr::create(Aliasee, getContext());
120 EmitAssignment(Alias, Value);
Teresa Johnsond8204472017-03-09 00:19:49 +0000121 SymverAliasMap[Aliasee].push_back(Alias);
122}