LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GCMetadata.cpp
Go to the documentation of this file.
1 //===-- GCMetadata.cpp - Garbage collector metadata -----------------------===//
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 //
10 // This file implements the GCFunctionInfo class and GCModuleInfo pass.
11 //
12 //===----------------------------------------------------------------------===//
13 
17 #include "llvm/CodeGen/Passes.h"
18 #include "llvm/IR/Function.h"
19 #include "llvm/MC/MCSymbol.h"
20 #include "llvm/Pass.h"
21 #include "llvm/Support/Debug.h"
24 using namespace llvm;
25 
26 namespace {
27 
28  class Printer : public FunctionPass {
29  static char ID;
30  raw_ostream &OS;
31 
32  public:
33  explicit Printer(raw_ostream &OS) : FunctionPass(ID), OS(OS) {}
34 
35 
36  const char *getPassName() const;
37  void getAnalysisUsage(AnalysisUsage &AU) const;
38 
39  bool runOnFunction(Function &F);
40  bool doFinalization(Module &M);
41  };
42 
43 }
44 
45 INITIALIZE_PASS(GCModuleInfo, "collector-metadata",
46  "Create Garbage Collector Module Metadata", false, false)
47 
48 // -----------------------------------------------------------------------------
49 
51  : F(F), S(S), FrameSize(~0LL) {}
52 
54 
55 // -----------------------------------------------------------------------------
56 
57 char GCModuleInfo::ID = 0;
58 
60  : ImmutablePass(ID) {
62 }
63 
65  clear();
66 }
67 
68 GCStrategy *GCModuleInfo::getOrCreateStrategy(const Module *M,
69  const std::string &Name) {
70  strategy_map_type::iterator NMI = StrategyMap.find(Name);
71  if (NMI != StrategyMap.end())
72  return NMI->getValue();
73 
75  E = GCRegistry::end(); I != E; ++I) {
76  if (Name == I->getName()) {
77  GCStrategy *S = I->instantiate();
78  S->M = M;
79  S->Name = Name;
80  StrategyMap.GetOrCreateValue(Name).setValue(S);
81  StrategyList.push_back(S);
82  return S;
83  }
84  }
85 
86  dbgs() << "unsupported GC: " << Name << "\n";
88 }
89 
91  assert(!F.isDeclaration() && "Can only get GCFunctionInfo for a definition!");
92  assert(F.hasGC());
93 
94  finfo_map_type::iterator I = FInfoMap.find(&F);
95  if (I != FInfoMap.end())
96  return *I->second;
97 
98  GCStrategy *S = getOrCreateStrategy(F.getParent(), F.getGC());
100  FInfoMap[&F] = GFI;
101  return *GFI;
102 }
103 
105  FInfoMap.clear();
106  StrategyMap.clear();
107 
108  for (iterator I = begin(), E = end(); I != E; ++I)
109  delete *I;
110  StrategyList.clear();
111 }
112 
113 // -----------------------------------------------------------------------------
114 
115 char Printer::ID = 0;
116 
118  return new Printer(OS);
119 }
120 
121 
122 const char *Printer::getPassName() const {
123  return "Print Garbage Collector Information";
124 }
125 
126 void Printer::getAnalysisUsage(AnalysisUsage &AU) const {
128  AU.setPreservesAll();
130 }
131 
132 static const char *DescKind(GC::PointKind Kind) {
133  switch (Kind) {
134  case GC::Loop: return "loop";
135  case GC::Return: return "return";
136  case GC::PreCall: return "pre-call";
137  case GC::PostCall: return "post-call";
138  }
139  llvm_unreachable("Invalid point kind");
140 }
141 
142 bool Printer::runOnFunction(Function &F) {
143  if (F.hasGC()) return false;
144 
145  GCFunctionInfo *FD = &getAnalysis<GCModuleInfo>().getFunctionInfo(F);
146 
147  OS << "GC roots for " << FD->getFunction().getName() << ":\n";
149  RE = FD->roots_end(); RI != RE; ++RI)
150  OS << "\t" << RI->Num << "\t" << RI->StackOffset << "[sp]\n";
151 
152  OS << "GC safe points for " << FD->getFunction().getName() << ":\n";
153  for (GCFunctionInfo::iterator PI = FD->begin(),
154  PE = FD->end(); PI != PE; ++PI) {
155 
156  OS << "\t" << PI->Label->getName() << ": "
157  << DescKind(PI->Kind) << ", live = {";
158 
159  for (GCFunctionInfo::live_iterator RI = FD->live_begin(PI),
160  RE = FD->live_end(PI);;) {
161  OS << " " << RI->Num;
162  if (++RI == RE)
163  break;
164  OS << ",";
165  }
166 
167  OS << " }\n";
168  }
169 
170  return false;
171 }
172 
173 bool Printer::doFinalization(Module &M) {
174  GCModuleInfo *GMI = getAnalysisIfAvailable<GCModuleInfo>();
175  assert(GMI && "Printer didn't require GCModuleInfo?!");
176  GMI->clear();
177  return false;
178 }
static PassRegistry * getPassRegistry()
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
void setValue(const ValueTy &V)
Definition: StringMap.h:135
virtual void getAnalysisUsage(AnalysisUsage &) const
Definition: Pass.cpp:75
const char * getGC() const
Definition: Function.cpp:315
static iterator end()
Definition: Registry.h:119
iterator find(StringRef Key)
Definition: StringMap.h:291
F(f)
print alias Alias Set Printer
StringRef getName() const
Definition: Value.cpp:167
std::vector< GCPoint >::iterator iterator
Definition: GCMetadata.h:85
AnalysisUsage & addRequired()
static iterator begin()
Definition: Registry.h:118
#define llvm_unreachable(msg)
iterator end() const
Definition: GCMetadata.h:191
GCFunctionInfo & getFunctionInfo(const Function &F)
Definition: GCMetadata.cpp:90
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
list_type::const_iterator iterator
Definition: GCMetadata.h:176
StringMapIterator< GCStrategy * > iterator
Definition: StringMap.h:276
FunctionPass * createGCInfoPrinter(raw_ostream &OS)
Definition: GCMetadata.cpp:117
roots_iterator roots_end()
Definition: GCMetadata.h:151
Instr is the return address of a call.
Definition: GCMetadata.h:54
Instr is a loop (backwards branch).
Definition: GCMetadata.h:51
iterator end()
Definition: DenseMap.h:57
roots_iterator roots_begin()
Definition: GCMetadata.h:150
live_iterator live_begin(const iterator &p)
Definition: GCMetadata.h:156
Instr is a return instruction.
Definition: GCMetadata.h:52
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
Definition: Debug.cpp:101
bool hasGC() const
Definition: Function.cpp:310
static char ID
Definition: GCMetadata.h:178
INITIALIZE_PASS(GCModuleInfo,"collector-metadata","Create Garbage Collector Module Metadata", false, false) GCFunctionInfo
Definition: GCMetadata.cpp:45
MapEntryTy & GetOrCreateValue(StringRef Key, InitTy Val)
Definition: StringMap.h:361
iterator begin() const
Definition: GCMetadata.h:190
bool isDeclaration() const
Definition: Globals.cpp:66
void initializeGCModuleInfoPass(PassRegistry &)
#define I(x, y, z)
Definition: MD5.cpp:54
Instr is a call instruction.
Definition: GCMetadata.h:53
GCFunctionInfo * insertFunctionInfo(const Function &F)
Definition: GCStrategy.cpp:126
Module * getParent()
Definition: GlobalValue.h:286
const Function & getFunction() const
Definition: GCMetadata.h:112
live_iterator live_end(const iterator &p)
Definition: GCMetadata.h:157
static const char * DescKind(GC::PointKind Kind)
Definition: GCMetadata.cpp:132
iterator find(const KeyT &Val)
Definition: DenseMap.h:108
std::vector< GCRoot >::iterator roots_iterator
Definition: GCMetadata.h:86
std::vector< GCRoot >::const_iterator live_iterator
Definition: GCMetadata.h:87
iterator end()
Definition: StringMap.h:281