RecordStreamer.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. //===-- RecordStreamer.cpp - Record asm definde and used symbols ----------===//
  2. //
  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. #include "RecordStreamer.h"
  10. #include "llvm/MC/MCSymbol.h"
  11. using namespace llvm;
  12. void RecordStreamer::markDefined(const MCSymbol &Symbol) {
  13. State &S = Symbols[Symbol.getName()];
  14. switch (S) {
  15. case DefinedGlobal:
  16. case Global:
  17. S = DefinedGlobal;
  18. break;
  19. case NeverSeen:
  20. case Defined:
  21. case Used:
  22. S = Defined;
  23. break;
  24. }
  25. }
  26. void RecordStreamer::markGlobal(const MCSymbol &Symbol) {
  27. State &S = Symbols[Symbol.getName()];
  28. switch (S) {
  29. case DefinedGlobal:
  30. case Defined:
  31. S = DefinedGlobal;
  32. break;
  33. case NeverSeen:
  34. case Global:
  35. case Used:
  36. S = Global;
  37. break;
  38. }
  39. }
  40. void RecordStreamer::markUsed(const MCSymbol &Symbol) {
  41. State &S = Symbols[Symbol.getName()];
  42. switch (S) {
  43. case DefinedGlobal:
  44. case Defined:
  45. case Global:
  46. break;
  47. case NeverSeen:
  48. case Used:
  49. S = Used;
  50. break;
  51. }
  52. }
  53. void RecordStreamer::visitUsedSymbol(const MCSymbol &Sym) { markUsed(Sym); }
  54. RecordStreamer::const_iterator RecordStreamer::begin() {
  55. return Symbols.begin();
  56. }
  57. RecordStreamer::const_iterator RecordStreamer::end() { return Symbols.end(); }
  58. RecordStreamer::RecordStreamer(MCContext &Context) : MCStreamer(Context) {}
  59. void RecordStreamer::EmitInstruction(const MCInst &Inst,
  60. const MCSubtargetInfo &STI) {
  61. MCStreamer::EmitInstruction(Inst, STI);
  62. }
  63. void RecordStreamer::EmitLabel(MCSymbol *Symbol) {
  64. MCStreamer::EmitLabel(Symbol);
  65. markDefined(*Symbol);
  66. }
  67. void RecordStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
  68. markDefined(*Symbol);
  69. MCStreamer::EmitAssignment(Symbol, Value);
  70. }
  71. bool RecordStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
  72. MCSymbolAttr Attribute) {
  73. if (Attribute == MCSA_Global)
  74. markGlobal(*Symbol);
  75. return true;
  76. }
  77. void RecordStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol,
  78. uint64_t Size, unsigned ByteAlignment) {
  79. markDefined(*Symbol);
  80. }
  81. void RecordStreamer::EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
  82. unsigned ByteAlignment) {
  83. markDefined(*Symbol);
  84. }