1 // RUN: %Slang %s 2 3 // RUN: %rs-filecheck-wrapper %s --check-prefix=CHECK-LL 4 // Check that the data types are properly padded: 5 // CHECK-LL: %struct.NoBitfield{{(\.[0-9]+)?}} = type { i32, [4 x i8], i64, float, [4 x i8] } 6 // CHECK-LL: %struct.Bitfield{{(\.[0-9]+)?}} = type { i32, [4 x i8], i64, i8 } 7 // Check that only NoBitfield is exported: 8 // CHECK-LL: !\23rs_export_type = !{![[NODE:[0-9]+]]} 9 // CHECK-LL: ![[NODE]] = !{!"NoBitfield"} 10 11 // RUN: %scriptc-filecheck-wrapper --lang=Java --type=NoBitfield --check-prefix=CHECK-JAVA-STRUCT %s 12 // CHECK-JAVA-STRUCT: public static Element createElement(RenderScript rs) { 13 // CHECK-JAVA-STRUCT-NEXT: Element.Builder eb = new Element.Builder(rs); 14 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.I32(rs), "I"); 15 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.U32(rs), "#rs_padding_1"); 16 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.I64(rs), "L"); 17 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.F32(rs), "F"); 18 // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.U32(rs), "#rs_padding_2"); 19 // CHECK-JAVA-STRUCT-NEXT: return eb.create(); 20 // CHECK-JAVA-STRUCT-NEXT: } 21 22 #pragma version(1) 23 #pragma rs java_package_name(foo) 24 25 // There is a C99 rule (under "Structure and union members") that 26 // reads "One special guarantee is made in order to simplify the use 27 // of unions: if a union contains several structures that share a 28 // common initial sequence, and if the union object currently contains 29 // one of these structures, it is permitted to inspect the common 30 // initial part of any of them anywhere that a declaration of the 31 // completed type of the union is visible. Two structures share a 32 // common initial sequence if corresponding members have compatible 33 // types (and, for bit-fields, the same widths) for a sequence of one 34 // or more initial members." 35 // 36 // We want to ensure that the common initial sequences of exported 37 // and non-exported types have the same layout. 38 39 // An exported type (because we declare a global variable of this type) 40 struct NoBitfield { 41 int I; 42 // expect 4 bytes of padding here 43 long L; 44 float F; 45 // expect 4 bytes of padding here 46 }; 47 48 struct NoBitfield junk; // just to make this an exported type 49 50 // A non-exported type that shares a common initial sequence with NoBitfield 51 struct Bitfield { 52 int I; 53 // expect 4 bytes of padding here 54 long L; 55 uint U:3; 56 }; 57 58 union CommonInitialSequence { 59 struct NoBitfield nbf; 60 struct Bitfield bf; 61 }; 62 63 static union CommonInitialSequence U, V; 64 65 static struct NoBitfield *nbf; 66 static struct Bitfield * bf; 67 68 // Note: Sets through the exported type (NoBitfield) 69 void setUnion(long argL, int argI) { 70 nbf->L = argL; 71 nbf->I = argI; 72 } 73 74 bool failed = false; 75 76 // Note: Tests through the non-exported type (Bitfield) 77 void testUnion(long argL, int argI) { 78 failed |= ((bf->I != argI) || (bf->L != argL)); 79 } 80 81 // Note: Prevent compiler from optimizing setUnion()/testUnion() 82 // to convert indirect accesses through nbf/bf into direct 83 // accesses through U or V. 84 void choose(int i) { 85 if (i) { 86 nbf = &U.nbf; 87 bf = &U. bf; 88 } else { 89 nbf = &V.nbf; 90 bf = &V. bf; 91 } 92 } 93