| 3120 | } |
| 3121 | |
| 3122 | spv::StorageClass Module::StorageClass(const Instruction& insn) const { |
| 3123 | spv::StorageClass storage_class = spv::StorageClassMax; |
| 3124 | uint32_t ptr_id = 0; |
| 3125 | // TODO: this could be expanded to many more opcodes, |
| 3126 | // but only contains minimally necessary ones right now. |
| 3127 | switch (insn.Opcode()) { |
| 3128 | case spv::OpVariable: |
| 3129 | case spv::OpUntypedVariableKHR: |
| 3130 | case spv::OpTypePointer: |
| 3131 | case spv::OpTypeForwardPointer: |
| 3132 | case spv::OpTypeUntypedPointerKHR: |
| 3133 | storage_class = insn.StorageClass(); |
| 3134 | break; |
| 3135 | case spv::OpLoad: |
| 3136 | case spv::OpAtomicLoad: |
| 3137 | case spv::OpAtomicExchange: |
| 3138 | case spv::OpAtomicCompareExchange: |
| 3139 | case spv::OpAtomicIIncrement: |
| 3140 | case spv::OpAtomicIDecrement: |
| 3141 | case spv::OpAtomicIAdd: |
| 3142 | case spv::OpAtomicISub: |
| 3143 | case spv::OpAtomicSMin: |
| 3144 | case spv::OpAtomicSMax: |
| 3145 | case spv::OpAtomicUMin: |
| 3146 | case spv::OpAtomicUMax: |
| 3147 | case spv::OpAtomicAnd: |
| 3148 | case spv::OpAtomicOr: |
| 3149 | case spv::OpAtomicFMinEXT: |
| 3150 | case spv::OpAtomicFMaxEXT: |
| 3151 | case spv::OpAtomicFAddEXT: |
| 3152 | ptr_id = insn.Word(3); |
| 3153 | break; |
| 3154 | case spv::OpStore: |
| 3155 | case spv::OpAtomicStore: |
| 3156 | ptr_id = insn.Word(1); |
| 3157 | break; |
| 3158 | default: |
| 3159 | break; |
| 3160 | } |
| 3161 | |
| 3162 | if (ptr_id != 0) { |
| 3163 | const uint32_t ptr_ty_id = GetTypeId(ptr_id); |
| 3164 | const Instruction* ptr_insn = FindDef(ptr_ty_id); |
| 3165 | storage_class = ptr_insn->StorageClass(); |
| 3166 | } |
| 3167 | |
| 3168 | return storage_class; |
| 3169 | } |
| 3170 | |
| 3171 | bool Module::UsesStorageCapabilityStorageClass(const Instruction& insn) const { |
| 3172 | switch (StorageClass(insn)) { |
no test coverage detected