| Eric Christopher | 4bbb3c4 | 2012-07-19 22:22:58 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -o - %s | FileCheck %s | 
| Daniel Dunbar | e4f25b7 | 2009-04-22 17:43:55 +0000 | [diff] [blame] | 2 |  | 
| Eric Christopher | 4bbb3c4 | 2012-07-19 22:22:58 +0000 | [diff] [blame] | 3 | // CHECK: @"OBJC_IVAR_$_I3._iv2" = global i64 8, section "__DATA, __objc_ivar", align 8 | 
|  | 4 | // CHECK: @"OBJC_IVAR_$_I3._iv3" = global i64 12, section "__DATA, __objc_ivar", align 8 | 
|  | 5 | // CHECK: _OBJC_CLASS_RO_$_I3" = internal global {{.*}} { i32 0, i32 8, i32 13 | 
|  | 6 | // CHECK: @"OBJC_IVAR_$_I4._iv4" = global i64 13, section "__DATA, __objc_ivar", align 8 | 
|  | 7 | // CHECK: _OBJC_CLASS_RO_$_I4" = internal global {{.*}} { i32 0, i32 13, i32 14, {{.*}} | 
|  | 8 | // CHECK: @"OBJC_IVAR_$_I5._iv6_synth" = hidden global i64 16, section "__DATA, __objc_ivar", align 8 | 
|  | 9 | // CHECK: @"OBJC_IVAR_$_I5._iv7_synth" = hidden global i64 20, section "__DATA, __objc_ivar", align 8 | 
|  | 10 | // CHECK: @"OBJC_IVAR_$_I5._iv5" = global i64 14, section "__DATA, __objc_ivar", align 8 | 
|  | 11 | // CHECK: _OBJC_CLASS_RO_$_I5" = internal global {{.*}} { i32 0, i32 14, i32 24, {{.*}} | 
|  | 12 | // CHECK: @"OBJC_IVAR_$_I6.iv0" = global i64 0, section "__DATA, __objc_ivar", align 8 | 
|  | 13 | // CHECK: _OBJC_CLASS_RO_$_I6" = internal global {{.*}} { i32 2, i32 0, i32 1, {{.*}} | 
|  | 14 | // CHECK: @"OBJC_IVAR_$_I8.b" = global i64 8, section "__DATA, __objc_ivar", align 8 | 
|  | 15 | // CHECK: _OBJC_CLASS_RO_$_I8" = internal global {{.*}} { i32 0, i32 8, i32 16, {{.*}} | 
|  | 16 | // CHECK: @"OBJC_IVAR_$_I9.iv0" = global i64 0, section "__DATA, __objc_ivar", align 8 | 
|  | 17 | // CHECK: _OBJC_CLASS_RO_$_I9" = internal global {{.*}} { i32 2, i32 0, i32 4, {{.*}} | 
|  | 18 | // CHECK: @"OBJC_IVAR_$_I10.iv1" = global i64 4, section "__DATA, __objc_ivar", align 8 | 
|  | 19 | // CHECK: _OBJC_CLASS_RO_$_I10" = internal global {{.*}} { i32 0, i32 4, i32 5, {{.*}} | 
|  | 20 | // CHECK: _OBJC_CLASS_RO_$_I11" = internal global {{.*}} { i32 0, i32 5, i32 5, {{.*}} | 
|  | 21 | // CHECK: @"OBJC_IVAR_$_I12.iv2" = global i64 8, section "__DATA, __objc_ivar", align 8 | 
|  | 22 | // CHECK: _OBJC_CLASS_RO_$_I12" = internal global {{.*}} { i32 0, i32 8, i32 12, {{.*}} | 
| Daniel Dunbar | e4f25b7 | 2009-04-22 17:43:55 +0000 | [diff] [blame] | 23 |  | 
| Daniel Dunbar | 9b042e0 | 2009-05-04 23:23:09 +0000 | [diff] [blame] | 24 | /* | 
|  | 25 | Compare to: | 
| Eric Christopher | 4bbb3c4 | 2012-07-19 22:22:58 +0000 | [diff] [blame] | 26 | gcc -m64 -S -o - interface-layout-64.m | grep '^_OBJC_IVAR_$_*{{.*}}' -A 1 | 
| Daniel Dunbar | 9b042e0 | 2009-05-04 23:23:09 +0000 | [diff] [blame] | 27 | and | 
| Eric Christopher | 4bbb3c4 | 2012-07-19 22:22:58 +0000 | [diff] [blame] | 28 | gcc -m64 -S -o - interface-layout-64.m | grep '^l{{.*}}_CLASS_RO_$_I[0-9]*' -A 3 | 
| Daniel Dunbar | 9b042e0 | 2009-05-04 23:23:09 +0000 | [diff] [blame] | 29 | */ | 
|  | 30 |  | 
| Daniel Dunbar | e4f25b7 | 2009-04-22 17:43:55 +0000 | [diff] [blame] | 31 | struct s0 { | 
|  | 32 | double x; | 
|  | 33 | }; | 
|  | 34 |  | 
|  | 35 | @interface I2 { | 
|  | 36 | struct s0 _iv1; | 
|  | 37 | } | 
|  | 38 | @end | 
|  | 39 |  | 
|  | 40 | @interface I3 : I2 { | 
|  | 41 | unsigned int _iv2 :1; | 
|  | 42 | unsigned : 0; | 
|  | 43 | unsigned int _iv3 : 3; | 
|  | 44 | } | 
|  | 45 | @end | 
|  | 46 |  | 
|  | 47 | @interface I4 : I3 { | 
|  | 48 | char _iv4; | 
|  | 49 | } | 
|  | 50 | @end | 
|  | 51 |  | 
|  | 52 | @interface I5 : I4 { | 
|  | 53 | char _iv5; | 
|  | 54 | } | 
|  | 55 |  | 
|  | 56 | @property int prop0; | 
|  | 57 | @end | 
|  | 58 |  | 
|  | 59 | @implementation I3 | 
|  | 60 | @end | 
|  | 61 |  | 
|  | 62 | @implementation I4 | 
|  | 63 | @end | 
|  | 64 |  | 
|  | 65 | @interface I5 () | 
|  | 66 | @property int prop1; | 
|  | 67 | @property char prop2; | 
|  | 68 | @end | 
|  | 69 |  | 
|  | 70 | @implementation I5 | 
|  | 71 | @synthesize prop0 = _iv6_synth; | 
|  | 72 | @synthesize prop1 = _iv7_synth; | 
|  | 73 | @synthesize prop2 = _iv5; | 
|  | 74 | @end | 
| Daniel Dunbar | 9252ee1 | 2009-05-04 21:26:30 +0000 | [diff] [blame] | 75 |  | 
|  | 76 | // The size rounds up to the next available byte. | 
|  | 77 | @interface I6 { | 
|  | 78 | unsigned iv0 : 2; | 
|  | 79 | } | 
|  | 80 | @end | 
|  | 81 | @implementation I6 | 
|  | 82 | @end | 
|  | 83 |  | 
|  | 84 | // The start of the subclass includes padding for its own alignment. | 
|  | 85 | @interface I7 { | 
|  | 86 | char a; | 
|  | 87 | } | 
|  | 88 | @end | 
|  | 89 | @interface I8 : I7 { | 
|  | 90 | double b; | 
|  | 91 | } | 
|  | 92 | @end | 
|  | 93 | @implementation I8 | 
|  | 94 | @end | 
|  | 95 |  | 
| Daniel Dunbar | 9b042e0 | 2009-05-04 23:23:09 +0000 | [diff] [blame] | 96 | // Padding bit-fields | 
|  | 97 | @interface I9 { | 
|  | 98 | unsigned iv0 : 2; | 
|  | 99 | unsigned : 0; | 
|  | 100 | } | 
|  | 101 | @end | 
|  | 102 | @implementation I9 | 
|  | 103 | @end | 
|  | 104 | @interface I10 : I9 { | 
|  | 105 | unsigned iv1 : 2; | 
|  | 106 | } | 
|  | 107 | @end | 
|  | 108 | @implementation I10 | 
|  | 109 | @end | 
|  | 110 |  | 
|  | 111 | // Empty structures | 
|  | 112 | @interface I11 : I10 | 
|  | 113 | @end | 
|  | 114 | @implementation I11 | 
|  | 115 | @end | 
|  | 116 | @interface I12 : I11 { | 
|  | 117 | unsigned iv2; | 
|  | 118 | } | 
|  | 119 | @end | 
|  | 120 | @implementation I12 | 
|  | 121 | @end |