brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · edb6e3a Raw
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