| // RUN: %Slang %s |
| |
| // RUN: %rs-filecheck-wrapper %s --check-prefix=CHECK-LL |
| // Check that the data types are properly padded: |
| // CHECK-LL: %struct.NoBitfield{{(\.[0-9]+)?}} = type { i32, [4 x i8], i64, float, [4 x i8] } |
| // CHECK-LL: %struct.Bitfield{{(\.[0-9]+)?}} = type { i32, [4 x i8], i64, i8 } |
| // Check that only NoBitfield is exported: |
| // CHECK-LL: !\23rs_export_type = !{![[NODE:[0-9]+]]} |
| // CHECK-LL: ![[NODE]] = !{!"NoBitfield"} |
| |
| // RUN: %scriptc-filecheck-wrapper --lang=Java --type=NoBitfield --check-prefix=CHECK-JAVA-STRUCT %s |
| // CHECK-JAVA-STRUCT: public static Element createElement(RenderScript rs) { |
| // CHECK-JAVA-STRUCT-NEXT: Element.Builder eb = new Element.Builder(rs); |
| // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.I32(rs), "I"); |
| // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.U32(rs), "#rs_padding_1"); |
| // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.I64(rs), "L"); |
| // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.F32(rs), "F"); |
| // CHECK-JAVA-STRUCT-NEXT: eb.add(Element.U32(rs), "#rs_padding_2"); |
| // CHECK-JAVA-STRUCT-NEXT: return eb.create(); |
| // CHECK-JAVA-STRUCT-NEXT: } |
| |
| #pragma version(1) |
| #pragma rs java_package_name(foo) |
| |
| // There is a C99 rule (under "Structure and union members") that |
| // reads "One special guarantee is made in order to simplify the use |
| // of unions: if a union contains several structures that share a |
| // common initial sequence, and if the union object currently contains |
| // one of these structures, it is permitted to inspect the common |
| // initial part of any of them anywhere that a declaration of the |
| // completed type of the union is visible. Two structures share a |
| // common initial sequence if corresponding members have compatible |
| // types (and, for bit-fields, the same widths) for a sequence of one |
| // or more initial members." |
| // |
| // We want to ensure that the common initial sequences of exported |
| // and non-exported types have the same layout. |
| |
| // An exported type (because we declare a global variable of this type) |
| struct NoBitfield { |
| int I; |
| // expect 4 bytes of padding here |
| long L; |
| float F; |
| // expect 4 bytes of padding here |
| }; |
| |
| struct NoBitfield junk; // just to make this an exported type |
| |
| // A non-exported type that shares a common initial sequence with NoBitfield |
| struct Bitfield { |
| int I; |
| // expect 4 bytes of padding here |
| long L; |
| uint U:3; |
| }; |
| |
| union CommonInitialSequence { |
| struct NoBitfield nbf; |
| struct Bitfield bf; |
| }; |
| |
| static union CommonInitialSequence U, V; |
| |
| static struct NoBitfield *nbf; |
| static struct Bitfield * bf; |
| |
| // Note: Sets through the exported type (NoBitfield) |
| void setUnion(long argL, int argI) { |
| nbf->L = argL; |
| nbf->I = argI; |
| } |
| |
| bool failed = false; |
| |
| // Note: Tests through the non-exported type (Bitfield) |
| void testUnion(long argL, int argI) { |
| failed |= ((bf->I != argI) || (bf->L != argL)); |
| } |
| |
| // Note: Prevent compiler from optimizing setUnion()/testUnion() |
| // to convert indirect accesses through nbf/bf into direct |
| // accesses through U or V. |
| void choose(int i) { |
| if (i) { |
| nbf = &U.nbf; |
| bf = &U. bf; |
| } else { |
| nbf = &V.nbf; |
| bf = &V. bf; |
| } |
| } |