Merge pull request #1602 from Igalia/apinheiro/prevent-xfbstride-twice

GlslangToSpv: prevent add XfbStride twice
diff --git a/Android.mk b/Android.mk
new file mode 100644
index 0000000..fda81a7
--- /dev/null
+++ b/Android.mk
@@ -0,0 +1,100 @@
+LOCAL_PATH := $(call my-dir)
+
+GLSLANG_OS_FLAGS := -DGLSLANG_OSINCLUDE_UNIX
+# AMD and NV extensions are turned on by default in upstream Glslang.
+GLSLANG_DEFINES:= -DAMD_EXTENSIONS -DNV_EXTENSIONS -DENABLE_HLSL $(GLSLANG_OS_FLAGS)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE:=OSDependent
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:=glslang/OSDependent/Unix/ossource.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) $(LOCAL_PATH)/glslang/OSDependent/Unix/
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/glslang/OSDependent/Unix/
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE:=OGLCompiler
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:=OGLCompilersDLL/InitializeDll.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH)/OGLCompiler
+LOCAL_STATIC_LIBRARIES:=OSDependent
+include $(BUILD_STATIC_LIBRARY)
+
+# Build Glslang's HLSL parser library.
+include $(CLEAR_VARS)
+LOCAL_MODULE:=HLSL
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_SRC_FILES:= \
+		hlsl/hlslAttributes.cpp \
+		hlsl/hlslGrammar.cpp \
+		hlsl/hlslOpMap.cpp \
+		hlsl/hlslParseables.cpp \
+		hlsl/hlslParseHelper.cpp \
+		hlsl/hlslScanContext.cpp \
+		hlsl/hlslTokenStream.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) \
+	$(LOCAL_PATH)/hlsl
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+GLSLANG_OUT_PATH=$(if $(call host-path-is-absolute,$(TARGET_OUT)),$(TARGET_OUT),$(abspath $(TARGET_OUT)))
+
+LOCAL_MODULE:=glslang
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:= \
+		glslang/GenericCodeGen/CodeGen.cpp \
+		glslang/GenericCodeGen/Link.cpp \
+		glslang/MachineIndependent/attribute.cpp \
+		glslang/MachineIndependent/Constant.cpp \
+		glslang/MachineIndependent/glslang_tab.cpp \
+		glslang/MachineIndependent/InfoSink.cpp \
+		glslang/MachineIndependent/Initialize.cpp \
+		glslang/MachineIndependent/Intermediate.cpp \
+		glslang/MachineIndependent/intermOut.cpp \
+		glslang/MachineIndependent/IntermTraverse.cpp \
+		glslang/MachineIndependent/iomapper.cpp \
+		glslang/MachineIndependent/limits.cpp \
+		glslang/MachineIndependent/linkValidate.cpp \
+		glslang/MachineIndependent/parseConst.cpp \
+		glslang/MachineIndependent/ParseContextBase.cpp \
+		glslang/MachineIndependent/ParseHelper.cpp \
+		glslang/MachineIndependent/PoolAlloc.cpp \
+		glslang/MachineIndependent/propagateNoContraction.cpp \
+		glslang/MachineIndependent/reflection.cpp \
+		glslang/MachineIndependent/RemoveTree.cpp \
+		glslang/MachineIndependent/Scan.cpp \
+		glslang/MachineIndependent/ShaderLang.cpp \
+		glslang/MachineIndependent/SymbolTable.cpp \
+		glslang/MachineIndependent/Versions.cpp \
+		glslang/MachineIndependent/preprocessor/PpAtom.cpp \
+		glslang/MachineIndependent/preprocessor/PpContext.cpp \
+		glslang/MachineIndependent/preprocessor/Pp.cpp \
+		glslang/MachineIndependent/preprocessor/PpScanner.cpp \
+		glslang/MachineIndependent/preprocessor/PpTokens.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) \
+	$(LOCAL_PATH)/glslang/MachineIndependent \
+	$(GLSLANG_OUT_PATH)
+LOCAL_STATIC_LIBRARIES:=OSDependent OGLCompiler HLSL
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE:=SPIRV
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror $(GLSLANG_DEFINES)
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)
+LOCAL_SRC_FILES:= \
+	SPIRV/GlslangToSpv.cpp \
+	SPIRV/InReadableOrder.cpp \
+	SPIRV/Logger.cpp \
+	SPIRV/SPVRemapper.cpp \
+	SPIRV/SpvBuilder.cpp \
+	SPIRV/SpvPostProcess.cpp \
+	SPIRV/SpvTools.cpp \
+	SPIRV/disassemble.cpp \
+	SPIRV/doc.cpp
+LOCAL_C_INCLUDES:=$(LOCAL_PATH) $(LOCAL_PATH)/glslang/SPIRV
+LOCAL_EXPORT_C_INCLUDES:=$(LOCAL_PATH)/glslang/SPIRV
+LOCAL_STATIC_LIBRARIES:=glslang
+include $(BUILD_STATIC_LIBRARY)
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 495a976..4c1dbd4 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -1825,6 +1825,12 @@
         unsigned int member = node->getOperand()->getAsBinaryNode()->getRight()->getAsConstantUnion()->getConstArray()[0].getUConst();
         spv::Id length = builder.createArrayLength(builder.accessChainGetLValue(), member);
 
+        // GLSL semantics say the result of .length() is an int, while SPIR-V says
+        // signedness must be 0. So, convert from SPIR-V unsigned back to GLSL's
+        // AST expectation of a signed result.
+        if (glslangIntermediate->getSource() == glslang::EShSourceGlsl)
+            length = builder.createUnaryOp(spv::OpBitcast, builder.makeIntType(32), length);
+
         builder.clearAccessChain();
         builder.setAccessChainRValue(length);
 
diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp
old mode 100644
new mode 100755
index 8755d9e..951d104
--- a/SPIRV/SpvBuilder.cpp
+++ b/SPIRV/SpvBuilder.cpp
@@ -1293,7 +1293,7 @@
 
 Id Builder::createArrayLength(Id base, unsigned int member)
 {
-    spv::Id intType = makeIntType(32);
+    spv::Id intType = makeUintType(32);
     Instruction* length = new Instruction(getUniqueId(), intType, OpArrayLength);
     length->addIdOperand(base);
     length->addImmediateOperand(member);
diff --git a/Test/baseResults/hlsl.structbuffer.byte.frag.out b/Test/baseResults/hlsl.structbuffer.byte.frag.out
index 49958a6..a23ccd2 100644
--- a/Test/baseResults/hlsl.structbuffer.byte.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.byte.frag.out
@@ -323,10 +323,6 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'pos' (layout( location=0) flat in uint)
 
-error: SPIRV-Tools Validation Errors
-error: OpStore Pointer <id> '14[size]'s type does not match Object <id> '20's type.
-  OpStore %size %20
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 114
@@ -370,13 +366,13 @@
         16(sbuf):             TypeStruct 15
               17:             TypePointer Uniform 16(sbuf)
         18(sbuf):     17(ptr) Variable Uniform
-              19:             TypeInt 32 1
-              21:     19(int) Constant 0
-              23:     19(int) Constant 2
+              20:             TypeInt 32 1
+              21:     20(int) Constant 0
+              23:     20(int) Constant 2
               25:             TypePointer Uniform 6(int)
-              29:             TypePointer Function 19(int)
+              29:             TypePointer Function 20(int)
               32:      6(int) Constant 4
-              39:     19(int) Constant 1
+              39:     20(int) Constant 1
               43:             TypeVector 6(int) 2
               45:             TypeVector 8(float) 2
               47:    8(float) Constant 0
@@ -384,7 +380,7 @@
               69:             TypeVector 6(int) 3
               71:             TypeVector 8(float) 3
               80:      6(int) Constant 12
-              95:     19(int) Constant 3
+              95:     20(int) Constant 3
               99:             TypeVector 6(int) 4
              106:             TypePointer Input 6(int)
         107(pos):    106(ptr) Variable Input
@@ -409,22 +405,22 @@
 30(byteAddrTemp):     29(ptr) Variable Function
 53(byteAddrTemp):     29(ptr) Variable Function
 78(byteAddrTemp):     29(ptr) Variable Function
-              20:     19(int) ArrayLength 18(sbuf) 0
-                              Store 14(size) 20
+              19:      6(int) ArrayLength 18(sbuf) 0
+                              Store 14(size) 19
               22:      6(int) Load 11(pos)
-              24:     19(int) ShiftRightLogical 22 23
+              24:     20(int) ShiftRightLogical 22 23
               26:     25(ptr) AccessChain 18(sbuf) 21 24
               27:      6(int) Load 26
               28:    8(float) ConvertUToF 27
               31:      6(int) Load 11(pos)
               33:      6(int) IAdd 31 32
-              34:     19(int) ShiftRightLogical 33 23
+              34:     20(int) ShiftRightLogical 33 23
                               Store 30(byteAddrTemp) 34
-              35:     19(int) Load 30(byteAddrTemp)
+              35:     20(int) Load 30(byteAddrTemp)
               36:     25(ptr) AccessChain 18(sbuf) 21 35
               37:      6(int) Load 36
-              38:     19(int) Load 30(byteAddrTemp)
-              40:     19(int) IAdd 38 39
+              38:     20(int) Load 30(byteAddrTemp)
+              40:     20(int) IAdd 38 39
               41:     25(ptr) AccessChain 18(sbuf) 21 40
               42:      6(int) Load 41
               44:   43(ivec2) CompositeConstruct 37 42
@@ -436,17 +432,17 @@
               52:    9(fvec4) FAdd 51 50
               54:      6(int) Load 11(pos)
               56:      6(int) IAdd 54 55
-              57:     19(int) ShiftRightLogical 56 23
+              57:     20(int) ShiftRightLogical 56 23
                               Store 53(byteAddrTemp) 57
-              58:     19(int) Load 53(byteAddrTemp)
+              58:     20(int) Load 53(byteAddrTemp)
               59:     25(ptr) AccessChain 18(sbuf) 21 58
               60:      6(int) Load 59
-              61:     19(int) Load 53(byteAddrTemp)
-              62:     19(int) IAdd 61 39
+              61:     20(int) Load 53(byteAddrTemp)
+              62:     20(int) IAdd 61 39
               63:     25(ptr) AccessChain 18(sbuf) 21 62
               64:      6(int) Load 63
-              65:     19(int) Load 53(byteAddrTemp)
-              66:     19(int) IAdd 65 23
+              65:     20(int) Load 53(byteAddrTemp)
+              66:     20(int) IAdd 65 23
               67:     25(ptr) AccessChain 18(sbuf) 21 66
               68:      6(int) Load 67
               70:   69(ivec3) CompositeConstruct 60 64 68
@@ -458,21 +454,21 @@
               77:    9(fvec4) FAdd 52 76
               79:      6(int) Load 11(pos)
               81:      6(int) IAdd 79 80
-              82:     19(int) ShiftRightLogical 81 23
+              82:     20(int) ShiftRightLogical 81 23
                               Store 78(byteAddrTemp) 82
-              83:     19(int) Load 78(byteAddrTemp)
+              83:     20(int) Load 78(byteAddrTemp)
               84:     25(ptr) AccessChain 18(sbuf) 21 83
               85:      6(int) Load 84
-              86:     19(int) Load 78(byteAddrTemp)
-              87:     19(int) IAdd 86 39
+              86:     20(int) Load 78(byteAddrTemp)
+              87:     20(int) IAdd 86 39
               88:     25(ptr) AccessChain 18(sbuf) 21 87
               89:      6(int) Load 88
-              90:     19(int) Load 78(byteAddrTemp)
-              91:     19(int) IAdd 90 23
+              90:     20(int) Load 78(byteAddrTemp)
+              91:     20(int) IAdd 90 23
               92:     25(ptr) AccessChain 18(sbuf) 21 91
               93:      6(int) Load 92
-              94:     19(int) Load 78(byteAddrTemp)
-              96:     19(int) IAdd 94 95
+              94:     20(int) Load 78(byteAddrTemp)
+              96:     20(int) IAdd 94 95
               97:     25(ptr) AccessChain 18(sbuf) 21 96
               98:      6(int) Load 97
              100:   99(ivec4) CompositeConstruct 85 89 93 98
diff --git a/Test/baseResults/hlsl.structbuffer.coherent.frag.out b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
index 1d11b64..738e13d 100644
--- a/Test/baseResults/hlsl.structbuffer.coherent.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.coherent.frag.out
@@ -175,10 +175,6 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'pos' (layout( location=0) flat in uint)
 
-error: SPIRV-Tools Validation Errors
-error: OpStore Pointer <id> '26[size]'s type does not match Object <id> '33's type.
-  OpStore %size %33
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 78
@@ -276,7 +272,7 @@
               22:      6(int) IAdd 20 21
               25:     24(ptr) AccessChain 17(sbuf2) 19 22
                               Store 25 23
-              33:     18(int) ArrayLength 32(sbuf) 0
+              33:      6(int) ArrayLength 32(sbuf) 0
                               Store 26(size) 33
                               Store 34(stride) 35
               36:      6(int) Load 11(pos)
diff --git a/Test/baseResults/hlsl.structbuffer.frag.out b/Test/baseResults/hlsl.structbuffer.frag.out
index e058d11..af76bfb 100644
--- a/Test/baseResults/hlsl.structbuffer.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.frag.out
@@ -187,10 +187,6 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'pos' (layout( location=0) flat in uint)
 
-error: SPIRV-Tools Validation Errors
-error: OpStore Pointer <id> '43[size]'s type does not match Object <id> '44's type.
-  OpStore %size %44
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 96
@@ -312,7 +308,7 @@
               41:    15(bool) INotEqual 39 35
               42:     37(ptr) AccessChain 18(mydata) 40
                               Store 42 41
-              44:     24(int) ArrayLength 23(sbuf) 0
+              44:      6(int) ArrayLength 23(sbuf) 0
                               Store 43(size) 44
                               Store 45(stride) 46
               47:      6(int) Load 11(pos)
diff --git a/Test/baseResults/hlsl.structbuffer.rw.frag.out b/Test/baseResults/hlsl.structbuffer.rw.frag.out
index 7fbd150..13a5956 100644
--- a/Test/baseResults/hlsl.structbuffer.rw.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.rw.frag.out
@@ -175,10 +175,6 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'pos' (layout( location=0) flat in uint)
 
-error: SPIRV-Tools Validation Errors
-error: OpStore Pointer <id> '26[size]'s type does not match Object <id> '33's type.
-  OpStore %size %33
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 78
@@ -274,7 +270,7 @@
               22:      6(int) IAdd 20 21
               25:     24(ptr) AccessChain 17(sbuf2) 19 22
                               Store 25 23
-              33:     18(int) ArrayLength 32(sbuf) 0
+              33:      6(int) ArrayLength 32(sbuf) 0
                               Store 26(size) 33
                               Store 34(stride) 35
               36:      6(int) Load 11(pos)
diff --git a/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out b/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
index ed27c89..690a0da 100644
--- a/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
+++ b/Test/baseResults/hlsl.structbuffer.rwbyte.frag.out
@@ -1003,10 +1003,6 @@
 0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
 0:?     'pos' (layout( location=0) flat in uint)
 
-error: SPIRV-Tools Validation Errors
-error: OpStore Pointer <id> '14[size]'s type does not match Object <id> '20's type.
-  OpStore %size %20
-
 // Module Version 10000
 // Generated by (magic number): 80007
 // Id's are bound by 239
@@ -1053,18 +1049,18 @@
         16(sbuf):             TypeStruct 15
               17:             TypePointer Uniform 16(sbuf)
         18(sbuf):     17(ptr) Variable Uniform
-              19:             TypeInt 32 1
-              21:             TypePointer Function 19(int)
-              24:     19(int) Constant 2
-              26:     19(int) Constant 0
+              20:             TypeInt 32 1
+              21:             TypePointer Function 20(int)
+              24:     20(int) Constant 2
+              26:     20(int) Constant 0
               30:             TypePointer Uniform 6(int)
-              45:     19(int) Constant 1
+              45:     20(int) Constant 1
               49:             TypeVector 6(int) 2
               51:      6(int) Constant 0
               66:      6(int) Constant 1
               87:             TypeVector 6(int) 3
              125:      6(int) Constant 2
-             147:     19(int) Constant 3
+             147:     20(int) Constant 3
              151:             TypeVector 6(int) 4
              219:      6(int) Constant 3
              231:             TypePointer Input 6(int)
@@ -1094,46 +1090,46 @@
 73(byteAddrTemp):     21(ptr) Variable Function
 128(byteAddrTemp):     21(ptr) Variable Function
 132(byteAddrTemp):     21(ptr) Variable Function
-              20:     19(int) ArrayLength 18(sbuf) 0
-                              Store 14(size) 20
+              19:      6(int) ArrayLength 18(sbuf) 0
+                              Store 14(size) 19
               23:      6(int) Load 11(pos)
-              25:     19(int) ShiftRightLogical 23 24
+              25:     20(int) ShiftRightLogical 23 24
                               Store 22(byteAddrTemp) 25
-              27:     19(int) Load 22(byteAddrTemp)
+              27:     20(int) Load 22(byteAddrTemp)
               28:      6(int) Load 11(pos)
-              29:     19(int) ShiftRightLogical 28 24
+              29:     20(int) ShiftRightLogical 28 24
               31:     30(ptr) AccessChain 18(sbuf) 26 29
               32:      6(int) Load 31
               33:     30(ptr) AccessChain 18(sbuf) 26 27
                               Store 33 32
               35:      6(int) Load 11(pos)
-              36:     19(int) ShiftRightLogical 35 24
+              36:     20(int) ShiftRightLogical 35 24
                               Store 34(byteAddrTemp) 36
-              37:     19(int) Load 34(byteAddrTemp)
+              37:     20(int) Load 34(byteAddrTemp)
               39:      6(int) Load 11(pos)
-              40:     19(int) ShiftRightLogical 39 24
+              40:     20(int) ShiftRightLogical 39 24
                               Store 38(byteAddrTemp) 40
-              41:     19(int) Load 38(byteAddrTemp)
+              41:     20(int) Load 38(byteAddrTemp)
               42:     30(ptr) AccessChain 18(sbuf) 26 41
               43:      6(int) Load 42
-              44:     19(int) Load 38(byteAddrTemp)
-              46:     19(int) IAdd 44 45
+              44:     20(int) Load 38(byteAddrTemp)
+              46:     20(int) IAdd 44 45
               47:     30(ptr) AccessChain 18(sbuf) 26 46
               48:      6(int) Load 47
               50:   49(ivec2) CompositeConstruct 43 48
               52:      6(int) CompositeExtract 50 0
               53:     30(ptr) AccessChain 18(sbuf) 26 37
                               Store 53 52
-              54:     19(int) Load 34(byteAddrTemp)
-              55:     19(int) IAdd 54 45
+              54:     20(int) Load 34(byteAddrTemp)
+              55:     20(int) IAdd 54 45
               56:      6(int) Load 11(pos)
-              57:     19(int) ShiftRightLogical 56 24
+              57:     20(int) ShiftRightLogical 56 24
                               Store 38(byteAddrTemp) 57
-              58:     19(int) Load 38(byteAddrTemp)
+              58:     20(int) Load 38(byteAddrTemp)
               59:     30(ptr) AccessChain 18(sbuf) 26 58
               60:      6(int) Load 59
-              61:     19(int) Load 38(byteAddrTemp)
-              62:     19(int) IAdd 61 45
+              61:     20(int) Load 38(byteAddrTemp)
+              62:     20(int) IAdd 61 45
               63:     30(ptr) AccessChain 18(sbuf) 26 62
               64:      6(int) Load 63
               65:   49(ivec2) CompositeConstruct 60 64
@@ -1141,61 +1137,61 @@
               68:     30(ptr) AccessChain 18(sbuf) 26 55
                               Store 68 67
               70:      6(int) Load 11(pos)
-              71:     19(int) ShiftRightLogical 70 24
+              71:     20(int) ShiftRightLogical 70 24
                               Store 69(byteAddrTemp) 71
-              72:     19(int) Load 69(byteAddrTemp)
+              72:     20(int) Load 69(byteAddrTemp)
               74:      6(int) Load 11(pos)
-              75:     19(int) ShiftRightLogical 74 24
+              75:     20(int) ShiftRightLogical 74 24
                               Store 73(byteAddrTemp) 75
-              76:     19(int) Load 73(byteAddrTemp)
+              76:     20(int) Load 73(byteAddrTemp)
               77:     30(ptr) AccessChain 18(sbuf) 26 76
               78:      6(int) Load 77
-              79:     19(int) Load 73(byteAddrTemp)
-              80:     19(int) IAdd 79 45
+              79:     20(int) Load 73(byteAddrTemp)
+              80:     20(int) IAdd 79 45
               81:     30(ptr) AccessChain 18(sbuf) 26 80
               82:      6(int) Load 81
-              83:     19(int) Load 73(byteAddrTemp)
-              84:     19(int) IAdd 83 24
+              83:     20(int) Load 73(byteAddrTemp)
+              84:     20(int) IAdd 83 24
               85:     30(ptr) AccessChain 18(sbuf) 26 84
               86:      6(int) Load 85
               88:   87(ivec3) CompositeConstruct 78 82 86
               89:      6(int) CompositeExtract 88 0
               90:     30(ptr) AccessChain 18(sbuf) 26 72
                               Store 90 89
-              91:     19(int) Load 69(byteAddrTemp)
-              92:     19(int) IAdd 91 45
+              91:     20(int) Load 69(byteAddrTemp)
+              92:     20(int) IAdd 91 45
               93:      6(int) Load 11(pos)
-              94:     19(int) ShiftRightLogical 93 24
+              94:     20(int) ShiftRightLogical 93 24
                               Store 73(byteAddrTemp) 94
-              95:     19(int) Load 73(byteAddrTemp)
+              95:     20(int) Load 73(byteAddrTemp)
               96:     30(ptr) AccessChain 18(sbuf) 26 95
               97:      6(int) Load 96
-              98:     19(int) Load 73(byteAddrTemp)
-              99:     19(int) IAdd 98 45
+              98:     20(int) Load 73(byteAddrTemp)
+              99:     20(int) IAdd 98 45
              100:     30(ptr) AccessChain 18(sbuf) 26 99
              101:      6(int) Load 100
-             102:     19(int) Load 73(byteAddrTemp)
-             103:     19(int) IAdd 102 24
+             102:     20(int) Load 73(byteAddrTemp)
+             103:     20(int) IAdd 102 24
              104:     30(ptr) AccessChain 18(sbuf) 26 103
              105:      6(int) Load 104
              106:   87(ivec3) CompositeConstruct 97 101 105
              107:      6(int) CompositeExtract 106 1
              108:     30(ptr) AccessChain 18(sbuf) 26 92
                               Store 108 107
-             109:     19(int) Load 69(byteAddrTemp)
-             110:     19(int) IAdd 109 24
+             109:     20(int) Load 69(byteAddrTemp)
+             110:     20(int) IAdd 109 24
              111:      6(int) Load 11(pos)
-             112:     19(int) ShiftRightLogical 111 24
+             112:     20(int) ShiftRightLogical 111 24
                               Store 73(byteAddrTemp) 112
-             113:     19(int) Load 73(byteAddrTemp)
+             113:     20(int) Load 73(byteAddrTemp)
              114:     30(ptr) AccessChain 18(sbuf) 26 113
              115:      6(int) Load 114
-             116:     19(int) Load 73(byteAddrTemp)
-             117:     19(int) IAdd 116 45
+             116:     20(int) Load 73(byteAddrTemp)
+             117:     20(int) IAdd 116 45
              118:     30(ptr) AccessChain 18(sbuf) 26 117
              119:      6(int) Load 118
-             120:     19(int) Load 73(byteAddrTemp)
-             121:     19(int) IAdd 120 24
+             120:     20(int) Load 73(byteAddrTemp)
+             121:     20(int) IAdd 120 24
              122:     30(ptr) AccessChain 18(sbuf) 26 121
              123:      6(int) Load 122
              124:   87(ivec3) CompositeConstruct 115 119 123
@@ -1203,97 +1199,97 @@
              127:     30(ptr) AccessChain 18(sbuf) 26 110
                               Store 127 126
              129:      6(int) Load 11(pos)
-             130:     19(int) ShiftRightLogical 129 24
+             130:     20(int) ShiftRightLogical 129 24
                               Store 128(byteAddrTemp) 130
-             131:     19(int) Load 128(byteAddrTemp)
+             131:     20(int) Load 128(byteAddrTemp)
              133:      6(int) Load 11(pos)
-             134:     19(int) ShiftRightLogical 133 24
+             134:     20(int) ShiftRightLogical 133 24
                               Store 132(byteAddrTemp) 134
-             135:     19(int) Load 132(byteAddrTemp)
+             135:     20(int) Load 132(byteAddrTemp)
              136:     30(ptr) AccessChain 18(sbuf) 26 135
              137:      6(int) Load 136
-             138:     19(int) Load 132(byteAddrTemp)
-             139:     19(int) IAdd 138 45
+             138:     20(int) Load 132(byteAddrTemp)
+             139:     20(int) IAdd 138 45
              140:     30(ptr) AccessChain 18(sbuf) 26 139
              141:      6(int) Load 140
-             142:     19(int) Load 132(byteAddrTemp)
-             143:     19(int) IAdd 142 24
+             142:     20(int) Load 132(byteAddrTemp)
+             143:     20(int) IAdd 142 24
              144:     30(ptr) AccessChain 18(sbuf) 26 143
              145:      6(int) Load 144
-             146:     19(int) Load 132(byteAddrTemp)
-             148:     19(int) IAdd 146 147
+             146:     20(int) Load 132(byteAddrTemp)
+             148:     20(int) IAdd 146 147
              149:     30(ptr) AccessChain 18(sbuf) 26 148
              150:      6(int) Load 149
              152:  151(ivec4) CompositeConstruct 137 141 145 150
              153:      6(int) CompositeExtract 152 0
              154:     30(ptr) AccessChain 18(sbuf) 26 131
                               Store 154 153
-             155:     19(int) Load 128(byteAddrTemp)
-             156:     19(int) IAdd 155 45
+             155:     20(int) Load 128(byteAddrTemp)
+             156:     20(int) IAdd 155 45
              157:      6(int) Load 11(pos)
-             158:     19(int) ShiftRightLogical 157 24
+             158:     20(int) ShiftRightLogical 157 24
                               Store 132(byteAddrTemp) 158
-             159:     19(int) Load 132(byteAddrTemp)
+             159:     20(int) Load 132(byteAddrTemp)
              160:     30(ptr) AccessChain 18(sbuf) 26 159
              161:      6(int) Load 160
-             162:     19(int) Load 132(byteAddrTemp)
-             163:     19(int) IAdd 162 45
+             162:     20(int) Load 132(byteAddrTemp)
+             163:     20(int) IAdd 162 45
              164:     30(ptr) AccessChain 18(sbuf) 26 163
              165:      6(int) Load 164
-             166:     19(int) Load 132(byteAddrTemp)
-             167:     19(int) IAdd 166 24
+             166:     20(int) Load 132(byteAddrTemp)
+             167:     20(int) IAdd 166 24
              168:     30(ptr) AccessChain 18(sbuf) 26 167
              169:      6(int) Load 168
-             170:     19(int) Load 132(byteAddrTemp)
-             171:     19(int) IAdd 170 147
+             170:     20(int) Load 132(byteAddrTemp)
+             171:     20(int) IAdd 170 147
              172:     30(ptr) AccessChain 18(sbuf) 26 171
              173:      6(int) Load 172
              174:  151(ivec4) CompositeConstruct 161 165 169 173
              175:      6(int) CompositeExtract 174 1
              176:     30(ptr) AccessChain 18(sbuf) 26 156
                               Store 176 175
-             177:     19(int) Load 128(byteAddrTemp)
-             178:     19(int) IAdd 177 24
+             177:     20(int) Load 128(byteAddrTemp)
+             178:     20(int) IAdd 177 24
              179:      6(int) Load 11(pos)
-             180:     19(int) ShiftRightLogical 179 24
+             180:     20(int) ShiftRightLogical 179 24
                               Store 132(byteAddrTemp) 180
-             181:     19(int) Load 132(byteAddrTemp)
+             181:     20(int) Load 132(byteAddrTemp)
              182:     30(ptr) AccessChain 18(sbuf) 26 181
              183:      6(int) Load 182
-             184:     19(int) Load 132(byteAddrTemp)
-             185:     19(int) IAdd 184 45
+             184:     20(int) Load 132(byteAddrTemp)
+             185:     20(int) IAdd 184 45
              186:     30(ptr) AccessChain 18(sbuf) 26 185
              187:      6(int) Load 186
-             188:     19(int) Load 132(byteAddrTemp)
-             189:     19(int) IAdd 188 24
+             188:     20(int) Load 132(byteAddrTemp)
+             189:     20(int) IAdd 188 24
              190:     30(ptr) AccessChain 18(sbuf) 26 189
              191:      6(int) Load 190
-             192:     19(int) Load 132(byteAddrTemp)
-             193:     19(int) IAdd 192 147
+             192:     20(int) Load 132(byteAddrTemp)
+             193:     20(int) IAdd 192 147
              194:     30(ptr) AccessChain 18(sbuf) 26 193
              195:      6(int) Load 194
              196:  151(ivec4) CompositeConstruct 183 187 191 195
              197:      6(int) CompositeExtract 196 2
              198:     30(ptr) AccessChain 18(sbuf) 26 178
                               Store 198 197
-             199:     19(int) Load 128(byteAddrTemp)
-             200:     19(int) IAdd 199 147
+             199:     20(int) Load 128(byteAddrTemp)
+             200:     20(int) IAdd 199 147
              201:      6(int) Load 11(pos)
-             202:     19(int) ShiftRightLogical 201 24
+             202:     20(int) ShiftRightLogical 201 24
                               Store 132(byteAddrTemp) 202
-             203:     19(int) Load 132(byteAddrTemp)
+             203:     20(int) Load 132(byteAddrTemp)
              204:     30(ptr) AccessChain 18(sbuf) 26 203
              205:      6(int) Load 204
-             206:     19(int) Load 132(byteAddrTemp)
-             207:     19(int) IAdd 206 45
+             206:     20(int) Load 132(byteAddrTemp)
+             207:     20(int) IAdd 206 45
              208:     30(ptr) AccessChain 18(sbuf) 26 207
              209:      6(int) Load 208
-             210:     19(int) Load 132(byteAddrTemp)
-             211:     19(int) IAdd 210 24
+             210:     20(int) Load 132(byteAddrTemp)
+             211:     20(int) IAdd 210 24
              212:     30(ptr) AccessChain 18(sbuf) 26 211
              213:      6(int) Load 212
-             214:     19(int) Load 132(byteAddrTemp)
-             215:     19(int) IAdd 214 147
+             214:     20(int) Load 132(byteAddrTemp)
+             215:     20(int) IAdd 214 147
              216:     30(ptr) AccessChain 18(sbuf) 26 215
              217:      6(int) Load 216
              218:  151(ivec4) CompositeConstruct 205 209 213 217
@@ -1301,7 +1297,7 @@
              221:     30(ptr) AccessChain 18(sbuf) 26 200
                               Store 221 220
              222:      6(int) Load 11(pos)
-             223:     19(int) ShiftRightLogical 222 24
+             223:     20(int) ShiftRightLogical 222 24
              224:     30(ptr) AccessChain 18(sbuf) 26 223
              225:      6(int) Load 224
              226:    8(float) ConvertUToF 225
diff --git a/Test/baseResults/spv.310.comp.out b/Test/baseResults/spv.310.comp.out
index fd1309d..f4eaa20 100644
--- a/Test/baseResults/spv.310.comp.out
+++ b/Test/baseResults/spv.310.comp.out
@@ -1,14 +1,14 @@
 spv.310.comp
 // Module Version 10000
 // Generated by (magic number): 80007
-// Id's are bound by 71
+// Id's are bound by 72
 
                               Capability Shader
                               Capability DeviceGroup
                               Extension  "SPV_KHR_device_group"
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint GLCompute 4  "main" 53 64
+                              EntryPoint GLCompute 4  "main" 53 65
                               ExecutionMode 4 LocalSize 16 32 4
                               Source ESSL 310
                               SourceExtension  "GL_EXT_device_group"
@@ -30,7 +30,7 @@
                               MemberName 48(outs) 1  "va"
                               Name 50  "outnames"
                               Name 53  "gl_LocalInvocationID"
-                              Name 64  "gl_DeviceIndex"
+                              Name 65  "gl_DeviceIndex"
                               Decorate 11 ArrayStride 16
                               MemberDecorate 12(outb) 0 Offset 0
                               MemberDecorate 12(outb) 1 Offset 4
@@ -48,8 +48,8 @@
                               Decorate 48(outs) BufferBlock
                               Decorate 50(outnames) DescriptorSet 0
                               Decorate 53(gl_LocalInvocationID) BuiltIn LocalInvocationId
-                              Decorate 64(gl_DeviceIndex) BuiltIn DeviceIndex
-                              Decorate 70 BuiltIn WorkgroupSize
+                              Decorate 65(gl_DeviceIndex) BuiltIn DeviceIndex
+                              Decorate 71 BuiltIn WorkgroupSize
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeInt 32 0
@@ -89,15 +89,15 @@
               52:             TypePointer Input 51(ivec3)
 53(gl_LocalInvocationID):     52(ptr) Variable Input
               54:             TypePointer Input 6(int)
-              61:             TypePointer Uniform 15(int)
-              63:             TypePointer Input 15(int)
-64(gl_DeviceIndex):     63(ptr) Variable Input
-              65:      6(int) Constant 1
-              66:      6(int) Constant 3400
-              67:      6(int) Constant 16
-              68:      6(int) Constant 32
-              69:      6(int) Constant 4
-              70:   51(ivec3) ConstantComposite 67 68 69
+              62:             TypePointer Uniform 15(int)
+              64:             TypePointer Input 15(int)
+65(gl_DeviceIndex):     64(ptr) Variable Input
+              66:      6(int) Constant 1
+              67:      6(int) Constant 3400
+              68:      6(int) Constant 16
+              69:      6(int) Constant 32
+              70:      6(int) Constant 4
+              71:   51(ivec3) ConstantComposite 68 69 70
          4(main):           2 Function None 3
                5:             Label
                               ControlBarrier 7 7 8
@@ -124,10 +124,11 @@
               58:   22(fvec4) CompositeConstruct 57 57 57 57
               59:     29(ptr) AccessChain 50(outnames) 26 56
                               Store 59 58
-              60:     15(int) ArrayLength 14(outbname) 3
-              62:     61(ptr) AccessChain 50(outnames) 16
-                              Store 62 60
-                              MemoryBarrier 65 8
-                              MemoryBarrier 7 66
+              60:      6(int) ArrayLength 14(outbname) 3
+              61:     15(int) Bitcast 60
+              63:     62(ptr) AccessChain 50(outnames) 16
+                              Store 63 61
+                              MemoryBarrier 66 8
+                              MemoryBarrier 7 67
                               Return
                               FunctionEnd
diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h
index eafb8f6..e0c42c8 100644
--- a/glslang/Include/revision.h
+++ b/glslang/Include/revision.h
@@ -1,3 +1,3 @@
 // This header is generated by the make-revision script.
 
-#define GLSLANG_PATCH_LEVEL 3006
+#define GLSLANG_PATCH_LEVEL 3009
diff --git a/ndk_test/Android.mk b/ndk_test/Android.mk
new file mode 100644
index 0000000..bcf82dd
--- /dev/null
+++ b/ndk_test/Android.mk
@@ -0,0 +1,12 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_CPP_EXTENSION := .cc .cpp .cxx
+LOCAL_SRC_FILES:=test.cpp
+LOCAL_MODULE:=glslang_ndk_test
+LOCAL_LDLIBS:=-landroid
+LOCAL_CXXFLAGS:=-std=c++11 -fno-exceptions -fno-rtti -Werror
+LOCAL_STATIC_LIBRARIES:=glslang SPIRV HLSL
+include $(BUILD_SHARED_LIBRARY)
+
+include $(LOCAL_PATH)/../Android.mk
diff --git a/ndk_test/jni/Application.mk b/ndk_test/jni/Application.mk
new file mode 100644
index 0000000..d7ccd34
--- /dev/null
+++ b/ndk_test/jni/Application.mk
@@ -0,0 +1,5 @@
+APP_ABI := all
+APP_BUILD_SCRIPT := Android.mk
+APP_STL := gnustl_static
+APP_PLATFORM := android-9
+NDK_TOOLCHAIN_VERSION := 4.9
diff --git a/ndk_test/test.cpp b/ndk_test/test.cpp
new file mode 100644
index 0000000..dec53d0
--- /dev/null
+++ b/ndk_test/test.cpp
@@ -0,0 +1,19 @@
+// Copyright 2018 Google LLC.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "SPIRV/GlslangToSpv.h"
+
+void android_main(struct android_app* state) {
+  int version = glslang::GetSpirvGeneratorVersion();
+}