blob: 4d119091a3d2990c88b9f72ec9f3e3abd8404f90 [file] [log] [blame]
Eugene Zelenko1df42fa2017-04-24 23:21:38 +00001//===- RecordStreamer.h - Record asm defined and used symbols ---*- C++ -*-===//
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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000010#ifndef LLVM_LIB_OBJECT_RECORDSTREAMER_H
11#define LLVM_LIB_OBJECT_RECORDSTREAMER_H
Rafael Espindola13b69d62014-07-03 18:59:23 +000012
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000013#include "llvm/ADT/DenseMap.h"
14#include "llvm/ADT/StringMap.h"
15#include "llvm/MC/MCDirectives.h"
Rafael Espindola13b69d62014-07-03 18:59:23 +000016#include "llvm/MC/MCStreamer.h"
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000017#include "llvm/MC/MCSymbol.h"
18#include "llvm/Support/SMLoc.h"
19#include <vector>
Rafael Espindola13b69d62014-07-03 18:59:23 +000020
21namespace llvm {
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000022
Rafael Espindola13b69d62014-07-03 18:59:23 +000023class RecordStreamer : public MCStreamer {
24public:
Davide Italianof7518492016-09-15 17:54:22 +000025 enum State { NeverSeen, Global, Defined, DefinedGlobal, DefinedWeak, Used,
26 UndefinedWeak};
Rafael Espindola13b69d62014-07-03 18:59:23 +000027
28private:
29 StringMap<State> Symbols;
Teresa Johnsond8204472017-03-09 00:19:49 +000030 // Map of aliases created by .symver directives, saved so we can update
31 // their symbol binding after parsing complete. This maps from each
32 // aliasee to its list of aliases.
33 DenseMap<const MCSymbol *, std::vector<MCSymbol *>> SymverAliasMap;
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000034
Rafael Espindola13b69d62014-07-03 18:59:23 +000035 void markDefined(const MCSymbol &Symbol);
Davide Italianoec7e29e2016-06-22 20:48:15 +000036 void markGlobal(const MCSymbol &Symbol, MCSymbolAttr Attribute);
Rafael Espindola13b69d62014-07-03 18:59:23 +000037 void markUsed(const MCSymbol &Symbol);
38 void visitUsedSymbol(const MCSymbol &Sym) override;
39
40public:
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000041 RecordStreamer(MCContext &Context);
42
43 using const_iterator = StringMap<State>::const_iterator;
44
Rafael Espindola13b69d62014-07-03 18:59:23 +000045 const_iterator begin();
46 const_iterator end();
Andrew V. Tischenko75745d02017-04-14 07:44:23 +000047 void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI,
48 bool) override;
Rafael Espindolabe991572017-02-10 15:13:12 +000049 void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
Rafael Espindola13b69d62014-07-03 18:59:23 +000050 void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
51 bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
Rafael Espindola0709a7b2015-05-21 19:20:38 +000052 void EmitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
Rafael Espindola13b69d62014-07-03 18:59:23 +000053 unsigned ByteAlignment) override;
54 void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
55 unsigned ByteAlignment) override;
Teresa Johnsond8204472017-03-09 00:19:49 +000056 /// Record .symver aliases for later processing.
57 void emitELFSymverDirective(MCSymbol *Alias,
58 const MCSymbol *Aliasee) override;
59 /// Return the map of .symver aliasee to associated aliases.
60 DenseMap<const MCSymbol *, std::vector<MCSymbol *>> &symverAliases() {
61 return SymverAliasMap;
62 }
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000063
Teresa Johnsond8204472017-03-09 00:19:49 +000064 /// Get the state recorded for the given symbol.
65 State getSymbolState(const MCSymbol *Sym) {
66 auto SI = Symbols.find(Sym->getName());
67 if (SI == Symbols.end())
68 return NeverSeen;
69 return SI->second;
70 }
Rafael Espindola13b69d62014-07-03 18:59:23 +000071};
Eugene Zelenko1df42fa2017-04-24 23:21:38 +000072
73} // end namespace llvm
74
75#endif // LLVM_LIB_OBJECT_RECORDSTREAMER_H