diff options
Diffstat (limited to 'include/llvm/CodeGen/GCMetadata.h')
-rw-r--r-- | include/llvm/CodeGen/GCMetadata.h | 96 |
1 files changed, 47 insertions, 49 deletions
diff --git a/include/llvm/CodeGen/GCMetadata.h b/include/llvm/CodeGen/GCMetadata.h index 1fb3b502ee..e94aba388a 100644 --- a/include/llvm/CodeGen/GCMetadata.h +++ b/include/llvm/CodeGen/GCMetadata.h @@ -1,4 +1,4 @@ -//===-- CollectorMetadata.h - Garbage collector metadata ------------------===// +//===-- GCMetadata.h - Garbage collector metadata -------------------------===// // // The LLVM Compiler Infrastructure // @@ -7,33 +7,31 @@ // //===----------------------------------------------------------------------===// // -// This file declares the CollectorMetadata and CollectorModuleMetadata classes, -// which are used as a communication channel from the target code generator -// to the target garbage collectors. This interface allows code generators and -// garbage collectors to be developed independently. +// This file declares the GCFunctionInfo and GCModuleInfo classes, which are +// used as a communication channel from the target code generator to the target +// garbage collectors. This interface allows code generators and garbage +// collectors to be developed independently. // -// The CollectorMetadata class records the data necessary to build a type -// accurate stack map. Roots are specified in the LLVM IR using the llvm.gcroot -// intrinsic, which the code generator understands. The code generator records -// the stack offset for each GC root. Safe points are generated by the code -// generator according to the collector's declared needs (generally at function -// calls). +// The GCFunctionInfo class logs the data necessary to build a type accurate +// stack map. The code generator outputs: +// +// - Safe points as specified by the GCStrategy's NeededSafePoints. +// - Stack offsets for GC roots, as specified by calls to llvm.gcroot // -// Safe points and roots are sufficient to build type-accurate stack maps. As a -// refinement, liveness analysis calculates the set of live roots at each safe -// point. Liveness analysis is not presently performed, so all roots are assumed -// live. +// As a refinement, liveness analysis calculates the set of live roots at each +// safe point. Liveness analysis is not presently performed by the code +// generator, so all roots are assumed live. // -// CollectorModuleMetadata simply collects CollectorMetadata structures for each -// Function as it is compiled. This is necessary for collectors which must emit -// a stack map for the entire compilation unit. CollectorMetadata outlives the -// MachineFunction from which it is derived, so must not refer to any code -// generator data structures. +// GCModuleInfo simply collects GCFunctionInfo instances for each Function as +// they are compiled. This accretion is necessary for collectors which must emit +// a stack map for the compilation unit as a whole. Therefore, GCFunctionInfo +// outlives the MachineFunction from which it is derived and must not refer to +// any code generator data structures. // //===----------------------------------------------------------------------===// -#ifndef LLVM_CODEGEN_COLLECTORMETADATA_H -#define LLVM_CODEGEN_COLLECTORMETADATA_H +#ifndef LLVM_CODEGEN_GCMETADATA_H +#define LLVM_CODEGEN_GCMETADATA_H #include "llvm/Pass.h" #include "llvm/ADT/DenseMap.h" @@ -42,7 +40,7 @@ namespace llvm { class AsmPrinter; - class Collector; + class GCStrategy; class Constant; class TargetAsmInfo; @@ -78,9 +76,9 @@ namespace llvm { }; - /// CollectorMetadata - Garbage collection metadata for a function. + /// GCFunctionInfo - Garbage collection metadata for a single function. /// - class CollectorMetadata { + class GCFunctionInfo { public: typedef std::vector<GCPoint>::iterator iterator; typedef std::vector<GCRoot>::iterator roots_iterator; @@ -88,7 +86,7 @@ namespace llvm { private: const Function &F; - Collector &C; + GCStrategy &S; uint64_t FrameSize; std::vector<GCRoot> Roots; std::vector<GCPoint> SafePoints; @@ -104,20 +102,20 @@ namespace llvm { // are live per safe point (1.5% on 64-bit hosts). public: - CollectorMetadata(const Function &F, Collector &C); - ~CollectorMetadata(); + GCFunctionInfo(const Function &F, GCStrategy &S); + ~GCFunctionInfo(); /// getFunction - Return the function to which this metadata applies. /// const Function &getFunction() const { return F; } - /// getCollector - Return the collector for the function. + /// getStrategy - Return the GC strategy for the function. /// - Collector &getCollector() { return C; } + GCStrategy &getStrategy() { return S; } /// addStackRoot - Registers a root that lives on the stack. Num is the - /// stack object ID for the alloca (if the code generator is using - /// MachineFrameInfo). + /// stack object ID for the alloca (if the code generator is + // using MachineFrameInfo). void addStackRoot(int Num, Constant *Metadata) { Roots.push_back(GCRoot(Num, Metadata)); } @@ -154,39 +152,39 @@ namespace llvm { }; - /// CollectorModuleMetadata - Garbage collection metadata for a whole module. + /// GCModuleInfo - Garbage collection metadata for a whole module. /// - class CollectorModuleMetadata : public ImmutablePass { - typedef StringMap<Collector*> collector_map_type; - typedef std::vector<Collector*> list_type; - typedef DenseMap<const Function*,CollectorMetadata*> function_map_type; + class GCModuleInfo : public ImmutablePass { + typedef StringMap<GCStrategy*> strategy_map_type; + typedef std::vector<GCStrategy*> list_type; + typedef DenseMap<const Function*,GCFunctionInfo*> finfo_map_type; - collector_map_type NameMap; - list_type Collectors; - function_map_type Map; + strategy_map_type StrategyMap; + list_type StrategyList; + finfo_map_type FInfoMap; - Collector *getOrCreateCollector(const Module *M, const std::string &Name); + GCStrategy *getOrCreateStrategy(const Module *M, const std::string &Name); public: typedef list_type::const_iterator iterator; static char ID; - CollectorModuleMetadata(); - ~CollectorModuleMetadata(); + GCModuleInfo(); + ~GCModuleInfo(); - /// clear - Used to delete module metadata. The metadata deleter pass calls - /// this. + /// clear - Resets the pass. The metadata deleter pass calls this. + /// void clear(); - /// begin/end - Iterators for collectors. + /// begin/end - Iterators for used strategies. /// - iterator begin() const { return Collectors.begin(); } - iterator end() const { return Collectors.end(); } + iterator begin() const { return StrategyList.begin(); } + iterator end() const { return StrategyList.end(); } /// get - Look up function metadata. /// - CollectorMetadata &get(const Function &F); + GCFunctionInfo &getFunctionInfo(const Function &F); }; } |