Home | History | Annotate | Download | only in padding
      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