diff options
author | Alexey Bader <alexey.bader@intel.com> | 2016-03-18 17:52:41 +0300 |
---|---|---|
committer | Alexey Bader <alexey.bader@intel.com> | 2016-03-18 17:52:41 +0300 |
commit | 9fbf1b88fcf42671cb4a62c7673bcdfeafa8a71d (patch) | |
tree | 69f96e9380869b0a7a65e08e7ff52ec48fa3b799 /lib/SPIRV/libSPIRV/SPIRVModule.cpp | |
parent | bd2d2b3a536d8f8586bbb3d99649634802745d74 (diff) |
[SPIR-V] Added recursive type definition support.
Applied code review from suggestions from Sam.
Added support for TypeForwardPointer required by SPIR-V specification.
Diffstat (limited to 'lib/SPIRV/libSPIRV/SPIRVModule.cpp')
-rw-r--r-- | lib/SPIRV/libSPIRV/SPIRVModule.cpp | 101 |
1 files changed, 66 insertions, 35 deletions
diff --git a/lib/SPIRV/libSPIRV/SPIRVModule.cpp b/lib/SPIRV/libSPIRV/SPIRVModule.cpp index efaafd7..3862d18 100644 --- a/lib/SPIRV/libSPIRV/SPIRVModule.cpp +++ b/lib/SPIRV/libSPIRV/SPIRVModule.cpp @@ -144,7 +144,7 @@ public: }
void setGeneratorId(unsigned short Id) { GeneratorId = Id; }
void setGeneratorVer(unsigned short Ver) { GeneratorVer = Ver; }
- void resolveUnknownStructFields(); + void resolveUnknownStructFields();
// Object creation functions
template<class T> void addTo(std::vector<T *> &V, SPIRVEntry *E);
@@ -153,8 +153,8 @@ public: virtual SPIRVString *getString(const std::string &Str);
virtual SPIRVMemberName *addMemberName(SPIRVTypeStruct *ST,
SPIRVWord MemberNumber, const std::string &Name);
- virtual void addUnknownStructField(SPIRVTypeStruct *Struct, unsigned I, - SPIRVId ID); + virtual void addUnknownStructField(SPIRVTypeStruct *Struct, unsigned I,
+ SPIRVId ID);
virtual SPIRVLine *addLine(SPIRVEntry *E, SPIRVString *FileName, SPIRVWord Line,
SPIRVWord Column);
virtual void addCapability(SPIRVCapabilityKind);
@@ -192,12 +192,13 @@ public: const SPIRVTypeImageDescriptor &, SPIRVAccessQualifierKind);
virtual SPIRVTypeSampler *addSamplerType();
virtual SPIRVTypeSampledImage *addSampledImageType(SPIRVTypeImage *T);
- virtual SPIRVTypeStruct *openStructType(unsigned, const std::string &); - virtual void closeStructType(SPIRVTypeStruct *T, bool); + virtual SPIRVTypeStruct *openStructType(unsigned, const std::string &);
+ virtual void closeStructType(SPIRVTypeStruct *T, bool);
virtual SPIRVTypeVector *addVectorType(SPIRVType *, SPIRVWord);
virtual SPIRVType *addOpaqueGenericType(Op);
virtual SPIRVTypePipe *addPipeType();
virtual SPIRVTypeVoid *addVoidType();
+ virtual void createForwardPointers();
// Constant creation functions
virtual SPIRVInstruction *addBranchInst(SPIRVLabel *, SPIRVBasicBlock *);
@@ -218,7 +219,7 @@ public: // Instruction creation functions
virtual SPIRVInstruction *addPtrAccessChainInst(SPIRVType *, SPIRVValue *,
std::vector<SPIRVValue *>, SPIRVBasicBlock *, bool);
- virtual SPIRVInstruction *addAsyncGroupCopy(SPIRVValue *Scope, + virtual SPIRVInstruction *addAsyncGroupCopy(SPIRVValue *Scope,
SPIRVValue *Dest, SPIRVValue *Src, SPIRVValue *NumElems, SPIRVValue *Stride,
SPIRVValue *Event, SPIRVBasicBlock *BB);
virtual SPIRVInstruction *addExtInst(SPIRVType *,
@@ -307,6 +308,7 @@ private: typedef std::set<SPIRVId> SPIRVIdSet;
typedef std::vector<SPIRVId> SPIRVIdVec;
typedef std::vector<SPIRVFunction *> SPIRVFunctionVector;
+ typedef std::vector<SPIRVTypeForwardPointer *> SPIRVForwardPointerVec;
typedef std::vector<SPIRVType *> SPIRVTypeVec;
typedef std::vector<SPIRVValue *> SPIRVConstantVector;
typedef std::vector<SPIRVVariable *> SPIRVVariableVec;
@@ -319,9 +321,10 @@ private: typedef std::map<SPIRVExecutionModelKind, SPIRVIdSet> SPIRVExecModelIdSetMap;
typedef std::map<SPIRVExecutionModelKind, SPIRVIdVec> SPIRVExecModelIdVecMap;
typedef std::unordered_map<std::string, SPIRVString*> SPIRVStringMap;
- typedef std::map<SPIRVTypeStruct *, std::vector<std::pair<unsigned, SPIRVId>>> - SPIRVUnknownStructFieldMap; + typedef std::map<SPIRVTypeStruct *, std::vector<std::pair<unsigned, SPIRVId>>>
+ SPIRVUnknownStructFieldMap;
+ SPIRVForwardPointerVec ForwardPointerVec;
SPIRVTypeVec TypeVec;
SPIRVIdToEntryMap IdEntryMap;
SPIRVFunctionVector FuncVec;
@@ -340,7 +343,7 @@ private: SPIRVExecModelIdVecMap EntryPointVec;
SPIRVStringMap StrMap;
SPIRVCapSet CapSet;
- SPIRVUnknownStructFieldMap UnknownStructFieldMap; + SPIRVUnknownStructFieldMap UnknownStructFieldMap;
std::map<unsigned, SPIRVTypeInt*> IntTypeMap;
std::map<unsigned, SPIRVConstant*> LiteralMap;
@@ -608,19 +611,19 @@ SPIRVModuleImpl::setName(SPIRVEntry *E, const std::string &Name) { NamedId.erase(E->getId());
}
-void SPIRVModuleImpl::resolveUnknownStructFields() { - for (auto &KV : UnknownStructFieldMap) { - auto *Struct = KV.first; - for (auto &Indices : KV.second) { - unsigned I = Indices.first; - SPIRVId ID = Indices.second; - - auto Ty = static_cast<SPIRVType *>(getEntry(ID)); - Struct->setMemberType(I, Ty); - } - } -} - +void SPIRVModuleImpl::resolveUnknownStructFields() {
+ for (auto &KV : UnknownStructFieldMap) {
+ auto *Struct = KV.first;
+ for (auto &Indices : KV.second) {
+ unsigned I = Indices.first;
+ SPIRVId ID = Indices.second;
+
+ auto Ty = static_cast<SPIRVType *>(getEntry(ID));
+ Struct->setMemberType(I, Ty);
+ }
+ }
+}
+
// Type creation functions
template<class T>
T *
@@ -681,13 +684,13 @@ SPIRVModuleImpl::addOpaqueType(const std::string& Name) { return addType(new SPIRVTypeOpaque(this, getId(), Name));
}
-SPIRVTypeStruct *SPIRVModuleImpl::openStructType(unsigned NumMembers, - const std::string &Name) { - auto T = new SPIRVTypeStruct(this, getId(), NumMembers, Name); - return T; -} - -void SPIRVModuleImpl::closeStructType(SPIRVTypeStruct *T, bool Packed) { +SPIRVTypeStruct *SPIRVModuleImpl::openStructType(unsigned NumMembers,
+ const std::string &Name) {
+ auto T = new SPIRVTypeStruct(this, getId(), NumMembers, Name);
+ return T;
+}
+
+void SPIRVModuleImpl::closeStructType(SPIRVTypeStruct *T, bool Packed) {
addType(T);
T->setPacked(Packed);
}
@@ -729,6 +732,31 @@ SPIRVModuleImpl::addSampledImageType(SPIRVTypeImage *T) { return addType(new SPIRVTypeSampledImage(this, getId(), T));
}
+void SPIRVModuleImpl::createForwardPointers() {
+ std::unordered_set<SPIRVId> Seen;
+
+ for (auto *T : TypeVec) {
+ if (T->hasId())
+ Seen.insert(T->getId());
+
+ if (!T->isTypeStruct())
+ continue;
+
+ auto ST = static_cast<SPIRVTypeStruct *>(T);
+
+ for (unsigned i = 0; i < ST->getStructMemberCount(); ++i) {
+ auto MemberTy = ST->getStructMemberType(i);
+ if (!MemberTy->isTypePointer()) continue;
+ auto Ptr = static_cast<SPIRVTypePointer *>(MemberTy);
+
+ if (Seen.find(Ptr->getId()) == Seen.end()) {
+ ForwardPointerVec.push_back(new SPIRVTypeForwardPointer(
+ this, Ptr, Ptr->getPointerStorageClass()));
+ }
+ }
+ }
+}
+
SPIRVFunction *
SPIRVModuleImpl::addFunction(SPIRVFunction *Func) {
FuncVec.push_back(add(Func));
@@ -1019,7 +1047,7 @@ SPIRVModuleImpl::addPtrAccessChainInst(SPIRVType *Type, SPIRVValue *Base, }
SPIRVInstruction *
-SPIRVModuleImpl::addAsyncGroupCopy(SPIRVValue *Scope, +SPIRVModuleImpl::addAsyncGroupCopy(SPIRVValue *Scope,
SPIRVValue *Dest, SPIRVValue *Src, SPIRVValue *NumElems, SPIRVValue *Stride,
SPIRVValue *Event, SPIRVBasicBlock *BB) {
return addInstruction(new SPIRVGroupAsyncCopy(Scope, getId(), Dest, Src,
@@ -1156,6 +1184,7 @@ operator<< (spv_ostream &O, SPIRVModule &M) { << MI.DecGroupVec
<< MI.DecorateSet
<< MI.GroupDecVec
+ << MI.ForwardPointerVec
<< MI.TypeVec
<< MI.ConstVec
<< MI.VariableVec
@@ -1228,11 +1257,11 @@ SPIRVModuleImpl::addMemberName(SPIRVTypeStruct* ST, return add(new SPIRVMemberName(ST, MemberNumber, Name));
}
-void SPIRVModuleImpl::addUnknownStructField(SPIRVTypeStruct *Struct, unsigned I, - SPIRVId ID) { - UnknownStructFieldMap[Struct].push_back(std::make_pair(I, ID)); -} - +void SPIRVModuleImpl::addUnknownStructField(SPIRVTypeStruct *Struct, unsigned I,
+ SPIRVId ID) {
+ UnknownStructFieldMap[Struct].push_back(std::make_pair(I, ID));
+}
+
std::istream &
operator>> (std::istream &I, SPIRVModule &M) {
SPIRVDecoder Decoder(I, M);
@@ -1260,6 +1289,8 @@ operator>> (std::istream &I, SPIRVModule &M) { Decoder.getEntry();
MI.optimizeDecorates();
+ MI.resolveUnknownStructFields();
+ MI.createForwardPointers();
return I;
}
|