1f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===-- llvm/IR/ModuleSlotTracker.h -----------------------------*- C++ -*-===//
2f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
3f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
5f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
7f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//
8f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
9f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
10f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#ifndef LLVM_IR_MODULESLOTTRACKER_H
11f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#define LLVM_IR_MODULESLOTTRACKER_H
12f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
13f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include <memory>
14f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
15f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarnamespace llvm {
16f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
17f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass Module;
18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass Function;
19f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass SlotTracker;
20f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass Value;
21f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
22f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Manage lifetime of a slot tracker for printing IR.
23f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// Wrapper around the \a SlotTracker used internally by \a AsmWriter.  This
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// class allows callers to share the cost of incorporating the metadata in a
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// module or a function.
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar///
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// If the IR changes from underneath \a ModuleSlotTracker, strings like
29f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// "<badref>" will be printed, or, worse, the wrong slots entirely.
30f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarclass ModuleSlotTracker {
31f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Storage for a slot tracker.
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::unique_ptr<SlotTracker> MachineStorage;
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool ShouldCreateStorage = false;
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool ShouldInitializeAllMetadata = false;
35f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Module *M = nullptr;
37f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Function *F = nullptr;
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  SlotTracker *Machine = nullptr;
39f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
40f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarpublic:
41f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Wrap a preinitialized SlotTracker.
42f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ModuleSlotTracker(SlotTracker &Machine, const Module *M,
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                    const Function *F = nullptr);
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
45f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Construct a slot tracker from a module.
46f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///
47f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// If \a M is \c nullptr, uses a null slot tracker.  Otherwise, initializes
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// a slot tracker, and initializes all metadata slots.  \c
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// ShouldInitializeAllMetadata defaults to true because this is expected to
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// be shared between multiple callers, and otherwise MDNode references will
51f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// not match up.
52f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  explicit ModuleSlotTracker(const Module *M,
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                             bool ShouldInitializeAllMetadata = true);
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
55f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Destructor to clean up storage.
56f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ~ModuleSlotTracker();
57f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  /// Lazily creates a slot tracker.
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SlotTracker *getMachine();
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Module *getModule() const { return M; }
62f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  const Function *getCurrentFunction() const { return F; }
63f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
64f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Incorporate the given function.
65f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///
66f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Purge the currently incorporated function and incorporate \c F.  If \c F
67f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// is currently incorporated, this is a no-op.
68f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  void incorporateFunction(const Function &F);
69f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
70f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Return the slot number of the specified local value.
71f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ///
72f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// A function that defines this value should be incorporated prior to calling
73f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// this method.
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  /// Return -1 if the value is not in the function's SlotTracker.
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  int getLocalSlot(const Value *V);
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar};
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar} // end namespace llvm
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif
81