summaryrefslogtreecommitdiff
path: root/lib/SPIRV/libSPIRV/SPIRVModule.cpp
diff options
context:
space:
mode:
authorAlexey Bader <alexey.bader@intel.com>2016-03-18 17:52:41 +0300
committerAlexey Bader <alexey.bader@intel.com>2016-03-18 17:52:41 +0300
commit9fbf1b88fcf42671cb4a62c7673bcdfeafa8a71d (patch)
tree69f96e9380869b0a7a65e08e7ff52ec48fa3b799 /lib/SPIRV/libSPIRV/SPIRVModule.cpp
parentbd2d2b3a536d8f8586bbb3d99649634802745d74 (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.cpp101
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;
}