1 // RUN: %Slang %s 2 3 // RUN: %rs-filecheck-wrapper %s --check-prefix=CHECK-LL 4 // Check that the data type small_struct_2 is properly padded: 5 // CHECK-LL: %struct.small_struct_2{{(\.[0-9]+)?}} = type { i64, i32, [4 x i8] } 6 // Check that the helper function for unpacking an invokable's arguments 7 // accesses a properly (un)padded struct: 8 // CHECK-LL: define void @.helper_checkStruct({ i64, i32, [4 x i8] }* nocapture) 9 // CHECK-LL: [[FIELD_L_ADDR:%[0-9]+]] = getelementptr inbounds { i64, i32, [4 x i8] }, { i64, i32, [4 x i8] }* %0, i{{[0-9]+}} 0, i32 0 10 // CHECK-LL: [[FIELD_L_VAL:%[0-9]+]] = load i64, i64* [[FIELD_L_ADDR]] 11 // CHECK-LL: [[FIELD_I_ADDR:%[0-9]+]] = getelementptr inbounds { i64, i32, [4 x i8] }, { i64, i32, [4 x i8] }* %0, i{{[0-9]+}} 0, i32 1 12 // CHECK-LL: [[FIELD_I_VAL:%[0-9]+]] = load i32, i32* [[FIELD_I_ADDR]] 13 // CHECK-LL: call void @checkStruct(i64 [[FIELD_L_VAL]], i32 [[FIELD_I_VAL]]) 14 15 // RUN: %scriptc-filecheck-wrapper --lang=Java --type=small_struct_2 --check-prefix=CHECK-JAVA-STRUCT %s 16 // CHECK-JAVA-STRUCT: public static Element createElement(RenderScript rs) { 17 // CHECK-JAVA-STRUCT-NEXT: Element.Builder eb = new Element.Builder(rs); 18 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.I64(rs), "l"); 19 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.I32(rs), "i"); 20 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.U32(rs), "#rs_padding_1"); 21 // CHECK-JAVA-STRUCT-NEXT: return eb.create(); 22 // CHECK-JAVA-STRUCT-NEXT: } 23 24 // RUN: %scriptc-filecheck-wrapper --lang=Java --check-prefix=CHECK-JAVA-INVOKE %s 25 // CHECK-JAVA-INVOKE: public void invoke_checkStruct(long argL, int argI) { 26 // CHECK-JAVA-INVOKE-NEXT: FieldPacker checkStruct_fp = new FieldPacker(16); 27 // CHECK-JAVA-INVOKE-NEXT: checkStruct_fp.addI64(argL); 28 // CHECK-JAVA-INVOKE-NEXT: checkStruct_fp.addI32(argI); 29 // CHECK-JAVA-INVOKE-NEXT: checkStruct_fp.skip(4); 30 // CHECK-JAVA-INVOKE-NEXT: invoke(mExportFuncIdx_checkStruct, checkStruct_fp); 31 // CHECK-JAVA-INVOKE-NEXT: } 32 33 // Same as small_struct.rs except for order of fields (hence location of padding) in struct small_struct[_2]. 34 35 #pragma version(1) 36 #pragma rs java_package_name(foo) 37 38 typedef struct small_struct_2 { 39 long l; 40 int i; 41 // expect 4 bytes of padding here 42 } small_struct_2; 43 44 small_struct_2 g_small_struct_2; 45 46 bool failed = false; 47 48 void checkStruct(long argL, int argI) { 49 failed |= ((g_small_struct_2.l != argL) || (g_small_struct_2.i != argI)); 50 } 51