87 lines · c
1//===- RecordStreamer.h - Record asm defined and used symbols ---*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_LIB_OBJECT_RECORDSTREAMER_H10#define LLVM_LIB_OBJECT_RECORDSTREAMER_H11 12#include "llvm/ADT/DenseMap.h"13#include "llvm/ADT/MapVector.h"14#include "llvm/ADT/StringMap.h"15#include "llvm/MC/MCDirectives.h"16#include "llvm/MC/MCStreamer.h"17#include "llvm/Support/SMLoc.h"18#include <vector>19 20namespace llvm {21 22class MCSymbol;23class Module;24 25class RecordStreamer : public MCStreamer {26public:27 enum State { NeverSeen, Global, Defined, DefinedGlobal, DefinedWeak, Used,28 UndefinedWeak};29 30private:31 const Module &M;32 StringMap<State> Symbols;33 // Map of aliases created by .symver directives, saved so we can update34 // their symbol binding after parsing complete. This maps from each35 // aliasee to its list of aliases.36 MapVector<const MCSymbol *, std::vector<StringRef>> SymverAliasMap;37 38 /// Get the state recorded for the given symbol.39 State getSymbolState(const MCSymbol *Sym);40 41 void markDefined(const MCSymbol &Symbol);42 void markGlobal(const MCSymbol &Symbol, MCSymbolAttr Attribute);43 void markUsed(const MCSymbol &Symbol);44 void visitUsedSymbol(const MCSymbol &Sym) override;45 46public:47 RecordStreamer(MCContext &Context, const Module &M);48 49 void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;50 void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;51 bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;52 void emitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size,53 Align ByteAlignment, SMLoc Loc = SMLoc()) override;54 void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,55 Align ByteAlignment) override;56 57 // Ignore format-specific directives; we do not need any information from58 // them, but the default implementation of these methods crashes, so we59 // override them with versions that do nothing.60 void emitSubsectionsViaSymbols() override {};61 void beginCOFFSymbolDef(const MCSymbol *Symbol) override {}62 void emitCOFFSymbolStorageClass(int StorageClass) override {}63 void emitCOFFSymbolType(int Type) override {}64 void endCOFFSymbolDef() override {}65 66 /// Record .symver aliases for later processing.67 void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name,68 bool KeepOriginalSym) override;69 70 // Emit ELF .symver aliases and ensure they have the same binding as the71 // defined symbol they alias with.72 void flushSymverDirectives();73 74 // Symbols iterators75 using const_iterator = StringMap<State>::const_iterator;76 const_iterator begin();77 const_iterator end();78 79 // SymverAliasMap iterators80 using const_symver_iterator = decltype(SymverAliasMap)::const_iterator;81 iterator_range<const_symver_iterator> symverAliases();82};83 84} // end namespace llvm85 86#endif // LLVM_LIB_OBJECT_RECORDSTREAMER_H87