summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/include/llvm/CodeGen/GCMetadata.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/include/llvm/CodeGen/GCMetadata.h')
-rw-r--r--contrib/llvm/include/llvm/CodeGen/GCMetadata.h36
1 files changed, 26 insertions, 10 deletions
diff --git a/contrib/llvm/include/llvm/CodeGen/GCMetadata.h b/contrib/llvm/include/llvm/CodeGen/GCMetadata.h
index ddcc823..c7f1ab8 100644
--- a/contrib/llvm/include/llvm/CodeGen/GCMetadata.h
+++ b/contrib/llvm/include/llvm/CodeGen/GCMetadata.h
@@ -37,7 +37,6 @@
#include "llvm/ADT/StringMap.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/Pass.h"
-
#include <memory>
namespace llvm {
@@ -80,8 +79,8 @@ namespace llvm {
};
- /// GCFunctionInfo - Garbage collection metadata for a single function.
- ///
+ /// Garbage collection metadata for a single function. Currently, this
+ /// information only applies to GCStrategies which use GCRoot.
class GCFunctionInfo {
public:
typedef std::vector<GCPoint>::iterator iterator;
@@ -160,21 +159,37 @@ namespace llvm {
size_t live_size(const iterator &p) const { return roots_size(); }
};
-
- /// GCModuleInfo - Garbage collection metadata for a whole module.
- ///
+ /// An analysis pass which caches information about the entire Module.
+ /// Records both the function level information used by GCRoots and a
+ /// cache of the 'active' gc strategy objects for the current Module.
class GCModuleInfo : public ImmutablePass {
typedef StringMap<GCStrategy*> strategy_map_type;
typedef std::vector<std::unique_ptr<GCStrategy>> list_type;
- typedef DenseMap<const Function*,GCFunctionInfo*> finfo_map_type;
strategy_map_type StrategyMap;
list_type StrategyList;
- finfo_map_type FInfoMap;
GCStrategy *getOrCreateStrategy(const Module *M, const std::string &Name);
public:
+ /// List of per function info objects. In theory, Each of these
+ /// may be associated with a different GC.
+ typedef std::vector<std::unique_ptr<GCFunctionInfo>> FuncInfoVec;
+
+ FuncInfoVec::iterator funcinfo_begin() { return Functions.begin(); }
+ FuncInfoVec::iterator funcinfo_end() { return Functions.end(); }
+
+
+ private:
+ /// Owning list of all GCFunctionInfos associated with this Module
+ FuncInfoVec Functions;
+
+ /// Non-owning map to bypass linear search when finding the GCFunctionInfo
+ /// associated with a particular Function.
+ typedef DenseMap<const Function*,GCFunctionInfo*> finfo_map_type;
+ finfo_map_type FInfoMap;
+ public:
+
typedef list_type::const_iterator iterator;
static char ID;
@@ -191,8 +206,9 @@ namespace llvm {
iterator begin() const { return StrategyList.begin(); }
iterator end() const { return StrategyList.end(); }
- /// get - Look up function metadata.
- ///
+ /// get - Look up function metadata. This is currently assumed
+ /// have the side effect of initializing the associated GCStrategy. That
+ /// will soon change.
GCFunctionInfo &getFunctionInfo(const Function &F);
};
OpenPOWER on IntegriCloud