Index: src/IceCfg.h |
diff --git a/src/IceCfg.h b/src/IceCfg.h |
index 95d79bcba2e554b7453a1412b63e6cb5e9ea2b2e..f6f330909e064a7c6837871fbd0c0d2b624bca27 100644 |
--- a/src/IceCfg.h |
+++ b/src/IceCfg.h |
@@ -20,6 +20,7 @@ |
#include "IceClFlags.h" |
#include "IceDefs.h" |
#include "IceGlobalContext.h" |
+#include "IceStringPool.h" |
#include "IceTypes.h" |
namespace Ice { |
@@ -53,9 +54,9 @@ public: |
/// \name Manage the name and return type of the function being translated. |
/// @{ |
- void setFunctionName(const IceString &Name) { FunctionName = Name; } |
- const IceString &getFunctionName() const { return FunctionName; } |
- IceString getFunctionNameAndSize() const; |
+ void setFunctionName(GlobalString Name) { FunctionName = Name; } |
+ GlobalString getFunctionName() const { return FunctionName; } |
+ std::string getFunctionNameAndSize() const; |
void setReturnType(Type Ty) { ReturnType = Ty; } |
Type getReturnType() const { return ReturnType; } |
/// @} |
@@ -73,9 +74,9 @@ public: |
/// missing, instead of an assertion failure, setError() should be called and |
/// the error should be propagated back up. This way, we can gracefully fail |
/// to translate and let a fallback translator handle the function. |
- void setError(const IceString &Message); |
+ void setError(const std::string &Message); |
bool hasError() const { return HasError; } |
- IceString getError() const { return ErrorMessage; } |
+ std::string getError() const { return ErrorMessage; } |
/// @} |
/// \name Manage nodes (a.k.a. basic blocks, CfgNodes). |
@@ -93,20 +94,10 @@ public: |
void swapNodes(NodeList &NewNodes); |
/// @} |
- using IdentifierIndexType = int32_t; |
- /// Adds a name to the list and returns its index, suitable for the argument |
- /// to getIdentifierName(). No checking for duplicates is done. This is |
- /// generally used for node names and variable names to avoid embedding a |
- /// std::string inside an arena-allocated object. |
- IdentifierIndexType addIdentifierName(const IceString &Name) { |
- IdentifierIndexType Index = IdentifierNames.size(); |
- IdentifierNames.push_back(Name); |
- return Index; |
- } |
- const IceString &getIdentifierName(IdentifierIndexType Index) const { |
- return IdentifierNames[Index]; |
- } |
- enum { IdentifierIndexInvalid = -1 }; |
+ /// String pool for CfgNode::Name values. |
+ StringPool *getNodeStrings() const { return NodeStrings.get(); } |
+ /// String pool for Variable::Name values. |
+ StringPool *getVarStrings() const { return VarStrings.get(); } |
/// \name Manage instruction numbering. |
/// @{ |
@@ -241,7 +232,7 @@ public: |
void emit(); |
void emitIAS(); |
- static void emitTextHeader(const IceString &Name, GlobalContext *Ctx, |
+ static void emitTextHeader(GlobalString Name, GlobalContext *Ctx, |
const Assembler *Asm); |
void dump(const char *Message = ""); |
@@ -277,9 +268,9 @@ private: |
/// code needs to be defined. |
void profileBlocks(); |
- void createNodeNameDeclaration(const IceString &NodeAsmName); |
+ void createNodeNameDeclaration(const std::string &NodeAsmName); |
void |
- createBlockProfilingInfoDeclaration(const IceString &NodeAsmName, |
+ createBlockProfilingInfoDeclaration(const std::string &NodeAsmName, |
VariableDeclaration *NodeNameDeclaration); |
/// Delete registered jump table placeholder instructions. This should only be |
@@ -302,20 +293,23 @@ private: |
uint32_t SequenceNumber; /// output order for emission |
uint32_t ConstantBlindingCookie = 0; /// cookie for constant blinding |
VerboseMask VMask; |
- IceString FunctionName = ""; |
+ GlobalString FunctionName; |
Type ReturnType = IceType_void; |
bool IsInternalLinkage = false; |
bool HasError = false; |
bool FocusedTiming = false; |
- IceString ErrorMessage = ""; |
+ std::string ErrorMessage = ""; |
CfgNode *Entry = nullptr; /// entry basic block |
NodeList Nodes; /// linearized node list; Entry should be first |
- std::vector<IceString> IdentifierNames; |
InstNumberT NextInstNumber; |
VarList Variables; |
VarList Args; /// subset of Variables, in argument order |
VarList ImplicitArgs; /// subset of Variables |
std::unique_ptr<ArenaAllocator> Allocator; |
+ // Separate string pools for CfgNode and Variable names, due to a combination |
+ // of the uniqueness requirement, and assumptions in lit tests. |
+ std::unique_ptr<StringPool> NodeStrings; |
+ std::unique_ptr<StringPool> VarStrings; |
std::unique_ptr<Liveness> Live; |
std::unique_ptr<TargetLowering> Target; |
std::unique_ptr<VariablesMetadata> VMetadata; |
@@ -336,6 +330,22 @@ public: |
template <> Variable *Cfg::makeVariable<Variable>(Type Ty); |
+struct NodeStringPoolTraits { |
+ using OwnerType = Cfg; |
+ static StringPool *getStrings(const OwnerType *PoolOwner) { |
+ return PoolOwner->getNodeStrings(); |
+ } |
+}; |
+using NodeString = StringID<NodeStringPoolTraits>; |
+ |
+struct VariableStringPoolTraits { |
+ using OwnerType = Cfg; |
+ static StringPool *getStrings(const OwnerType *PoolOwner) { |
+ return PoolOwner->getVarStrings(); |
+ } |
+}; |
+using VariableString = StringID<VariableStringPoolTraits>; |
+ |
} // end of namespace Ice |
#endif // SUBZERO_SRC_ICECFG_H |